Skip to content

Commit 580af2f

Browse files
wpierozakwpierozak
authored andcommitted
Fixed trigger bits assigment
1 parent 15a3914 commit 580af2f

4 files changed

Lines changed: 52 additions & 28 deletions

File tree

‎DataFormats/Detectors/FIT/FDD/include/DataFormatsFDD/FDDRecoConfig.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ struct FDDRecoConfig : o2::conf::ConfigurableParamHelper<FDDRecoConfig> {
5858
bool SwTriggerCoincidenceMode = true;
5959
bool SwTriggerEnabled = false;
6060

61-
uint8_t SwTriggerValidPmInputFlagMask = static_cast<uint8_t>(~(1u << ChannelData::kNumberADC));
62-
uint8_t SwTriggerValidPmInputFlags = static_cast<uint8_t>((1u << ChannelData::kIsCFDinADCgate) | (1u << ChannelData::kIsEventInTVDC));
61+
uint8_t SwTriggerValidPmInputFlagMask = static_cast<uint8_t>(~((1u << ChannelData::kNumberADC) | (1u << ChannelData::kIsEventInTVDC)));
62+
uint8_t SwTriggerValidPmInputFlags = static_cast<uint8_t>(1u << ChannelData::kIsCFDinADCgate);
6363
bool isChannelDataGoodForSwTrigger(uint8_t flags) const
6464
{
6565
return (flags & SwTriggerValidPmInputFlagMask) == SwTriggerValidPmInputFlags;

‎DataFormats/Detectors/FIT/FDD/include/DataFormatsFDD/RecPoint.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ class RecPoint
5353
public:
5454
enum TimeTypeIndex : int { TimeA,
5555
TimeC };
56-
enum ETriggerBits { kSwOrTrgSideA,
57-
kSwOrTrgSideC,
56+
enum ETriggerBits { kSwOrTrgSideA = 5,
57+
kSwOrTrgSideC = 6,
5858
kSwVtxTrg = 7 };
5959
RecPoint() = default;
6060
RecPoint(const std::array<int, 2>& collisiontime, int first, int ne,

‎Detectors/FIT/FDD/reconstruction/include/FDDReconstruction/Reconstructor.h‎

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ class Reconstructor
4242
}
4343

4444
private:
45-
static constexpr uint8_t coincidencePairsSideC[8] = {4, 5, 6, 7, 0, 1, 2, 3};
46-
static constexpr uint8_t coincidencePairsSideA[8] = {12, 13, 14, 15, 8, 9, 10, 11};
45+
static constexpr uint8_t coincidencePairs[Nchannels] = {4, 5, 6, 7, 0, 1, 2, 3, 12, 13, 14, 15, 8, 9, 10, 11};
4746

4847
bool isInAmplitudeWindow(int16_t amplitude)
4948
{
@@ -57,10 +56,6 @@ class Reconstructor
5756
{
5857
return FDDRecoConfig::Instance().isChannelDataGood(channelBits);
5958
}
60-
bool isCoincidenceConditionFulFilled(const bool* coincidencePairs, uint8_t channelNumber)
61-
{
62-
return (!FDDRecoConfig::Instance().SwTriggerCoincidenceMode) || ((channelNumber <= sSideAMaxId) ? coincidencePairs[coincidencePairsSideA[channelNumber]] : coincidencePairs[coincidencePairsSideC[channelNumber]]);
63-
}
6459

6560
bool isInCollisionTimeAmplitudeWindow(int16_t amplitude)
6661
{
@@ -78,21 +73,20 @@ class Reconstructor
7873
bool checkSwOrGateConditions(const ChannelData& channelData)
7974
{
8075
bool isAmplitudeInRange = false;
81-
if (channelData.mPMNumber <= sSideAMaxId) {
76+
if (channelData.mPMNumber >= sSideAStartId) {
8277
isAmplitudeInRange = channelData.mChargeADC > FDDRecoConfig::Instance().SwOrTriggerAmplitudeLowThresholdSideA && channelData.mChargeADC < FDDRecoConfig::Instance().SwOrTriggerAmplitudeHighThresholdSideA;
8378
} else {
8479
isAmplitudeInRange = channelData.mChargeADC > FDDRecoConfig::Instance().SwOrTriggerAmplitudeLowThresholdSideC && channelData.mChargeADC < FDDRecoConfig::Instance().SwOrTriggerAmplitudeHighThresholdSideC;
8580
}
86-
bool isInTimeWindow = std::abs(channelData.mTime) <= FDDRecoConfig::Instance().SwOrGate;
87-
bool isCfdInAdcGate = channelData.getFlag(ChannelData::EEventDataBit::kIsCFDinADCgate);
88-
return isAmplitudeInRange && isInTimeWindow && isCfdInAdcGate;
81+
bool isInTimeWindow = std::abs(channelData.mTime) < FDDRecoConfig::Instance().SwOrGate;
82+
return isAmplitudeInRange && isInTimeWindow && FDDRecoConfig::Instance().isChannelDataGoodForSwTrigger(channelData.mFEEBits);
8983
}
9084

9185
bool calculateSwTrigger(float meanTimeSideA, float meanTimeSideC, bool orGateSideA, bool orGateSideC)
9286
{
93-
return std::abs(meanTimeSideC - meanTimeSideA) < o2::fdd::timePerTDC * FDDRecoConfig::Instance().SwVtxTriggerTimeWindow && orGateSideA && orGateSideC;
87+
return (std::abs(meanTimeSideC - meanTimeSideA) < o2::fdd::timePerTDC * FDDRecoConfig::Instance().SwVtxTriggerTimeWindow) && orGateSideA && orGateSideC;
9488
}
95-
static constexpr uint8_t sSideAMaxId = 7;
89+
static constexpr uint8_t sSideAStartId = 8;
9690

9791
o2::fit::DeadChannelMap const* mDeadChannelMap = nullptr;
9892
ClassDefNV(Reconstructor, 3);

‎Detectors/FIT/FDD/reconstruction/src/Reconstructor.cxx‎

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,13 @@ void Reconstructor::process(o2::fdd::Digit const& digitBC, gsl::span<const o2::f
4040

4141
bool swOrGateSideA = false;
4242
bool swOrGateSideC = false;
43+
int64_t swTimeSideA = 0;
44+
int64_t swTimeSideC = 0;
45+
int64_t swEntriesNumSideA = 0;
46+
int64_t swEntriesNumSideC = 0;
4347

44-
bool coincidencePairs[Nchannels] = {false};
48+
bool coincidencePairsOrTrg[Nchannels] = {false};
49+
int64_t coincidencePairsTime[Nchannels] = {0};
4550

4651
for (const auto& channelData : inChData) {
4752
if (mDeadChannelMap && !mDeadChannelMap->isChannelAlive(channelData.mPMNumber)) {
@@ -58,16 +63,36 @@ void Reconstructor::process(o2::fdd::Digit const& digitBC, gsl::span<const o2::f
5863
storedEntries++;
5964

6065
if (FDDRecoConfig::Instance().SwTriggerEnabled) {
61-
if (chNum <= sSideAMaxId) {
62-
coincidencePairs[chNum] |= checkSwOrGateConditions(channelData);
63-
swOrGateSideA |= coincidencePairs[chNum] && isCoincidenceConditionFulFilled(coincidencePairs, chNum);
64-
} else {
65-
coincidencePairs[chNum] |= checkSwOrGateConditions(channelData);
66-
swOrGateSideC |= coincidencePairs[chNum] && isCoincidenceConditionFulFilled(coincidencePairs, chNum);
66+
coincidencePairsOrTrg[chNum] |= checkSwOrGateConditions(channelData);
67+
coincidencePairsTime[chNum] = channelData.mTime;
68+
if (FDDRecoConfig::Instance().SwTriggerCoincidenceMode && coincidencePairsOrTrg[chNum] && coincidencePairsOrTrg[coincidencePairs[chNum]]) {
69+
if (chNum >= sSideAStartId) {
70+
swOrGateSideA = true;
71+
swTimeSideA += channelData.mTime + coincidencePairsTime[coincidencePairs[chNum]];
72+
swEntriesNumSideA += 2;
73+
} else {
74+
swOrGateSideC = true;
75+
swTimeSideC += channelData.mTime + coincidencePairsTime[coincidencePairs[chNum]];
76+
swEntriesNumSideC += 2;
77+
}
78+
} else if (!FDDRecoConfig::Instance().SwTriggerCoincidenceMode && coincidencePairsOrTrg[chNum]) {
79+
if (chNum >= sSideAStartId) {
80+
swOrGateSideA = true;
81+
swTimeSideA += channelData.mTime;
82+
swEntriesNumSideA++;
83+
} else {
84+
swOrGateSideC = true;
85+
swTimeSideC += channelData.mTime;
86+
swEntriesNumSideC++;
87+
}
6788
}
6889
}
6990

70-
if (channelData.mPMNumber <= sSideAMaxId) {
91+
if (!isChannelDataGoodForCollisionTime(channelData.mFEEBits) || !isInCollisionTimeAmplitudeWindow(channelData.mChargeADC) || !isInCollisionTimeTimeWindow(channelData.mTime)) {
92+
continue;
93+
}
94+
95+
if (channelData.mPMNumber >= sSideAStartId) {
7196
timeSideA += channelData.mTime;
7297
entriesNumSideA++;
7398
} else {
@@ -77,10 +102,15 @@ void Reconstructor::process(o2::fdd::Digit const& digitBC, gsl::span<const o2::f
77102
}
78103

79104
constexpr float nsToPs = 1e3;
80-
float meanTimeSideA = float(timeSideA) * timePerTDC / float(entriesNumSideA);
81-
float meanTimeSideC = float(timeSideC) * timePerTDC / float(entriesNumSideC);
105+
float meanTimeSideA = entriesNumSideA > 0 ? float(timeSideA) * timePerTDC / float(entriesNumSideA) : 0;
106+
float meanTimeSideC = entriesNumSideC > 0 ? float(timeSideC) * timePerTDC / float(entriesNumSideC) : 0;
82107

83-
bool swVertexTrg = FDDRecoConfig::Instance().SwTriggerEnabled ? calculateSwTrigger(meanTimeSideA, meanTimeSideC, swOrGateSideA, swOrGateSideC) : false;
108+
bool swVertexTrg = false;
109+
if (FDDRecoConfig::Instance().SwTriggerEnabled) {
110+
float swMeanTimeSideA = swEntriesNumSideA > 0 ? float(swTimeSideA) * timePerTDC / float(swEntriesNumSideA) : 0;
111+
float swMeanTimeSideC = swEntriesNumSideC > 0 ? float(swTimeSideC) * timePerTDC / float(swEntriesNumSideC) : 0;
112+
swVertexTrg = calculateSwTrigger(swMeanTimeSideA, swMeanTimeSideC, swOrGateSideA, swOrGateSideC);
113+
}
84114

85115
std::array<int, 2> mCollisionTime = {o2::fdd::RecPoint::sDummyCollissionTime, o2::fdd::RecPoint::sDummyCollissionTime};
86116
if (entriesNumSideA > 0) {
@@ -89,7 +119,7 @@ void Reconstructor::process(o2::fdd::Digit const& digitBC, gsl::span<const o2::f
89119
if (entriesNumSideC > 0) {
90120
mCollisionTime[o2::fdd::RecPoint::TimeC] = std::round(meanTimeSideC * nsToPs);
91121
}
92-
RecPoints.emplace_back(mCollisionTime, firstEntry, storedEntries, digitBC.getIntRecord(), digitBC.mTriggers, swVertexTrg, swOrGateSideA, swOrGateSideC);
122+
RecPoints.emplace_back(mCollisionTime, firstEntry, storedEntries, digitBC.getIntRecord(), digitBC.mTriggers, swOrGateSideA, swOrGateSideC, swVertexTrg);
93123
}
94124
//________________________________________________________
95125
void Reconstructor::finish()

0 commit comments

Comments
 (0)