Skip to content

Commit ad6ce10

Browse files
wpierozakwpierozak
authored andcommitted
Implemented FT0-like collision time calulcation for FDD. Prepared methods and data structure for SW trigger implementation
1 parent 797b0e9 commit ad6ce10

3 files changed

Lines changed: 76 additions & 48 deletions

File tree

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ struct FDDRecoConfig : o2::conf::ConfigurableParamHelper<FDDRecoConfig> {
2525

2626
uint8_t ChannelValidPmInputFlagMask = 0;
2727
uint8_t ChannelValidPmInputFlags = 0;
28-
bool isChannelDataGoodForCollisionTime(uint8_t flags) const
28+
bool isChannelDataGood(uint8_t flags) const
2929
{
3030
return (flags & ChannelValidPmInputFlagMask) == ChannelValidPmInputFlags;
3131
}
@@ -54,10 +54,12 @@ struct FDDRecoConfig : o2::conf::ConfigurableParamHelper<FDDRecoConfig> {
5454
float SwTriggerTimeHighThreshold= 1.25;
5555
float SwTriggerAmplitudeLowThreshold = 0.0;
5656
float SwTriggerAmplitudeHighThreshold = 4096.0;
57+
float SwTriggerTimeDiffMin = -1.25;
58+
float SwTriggerTimeDiffMax = 1.25;
5759
bool SwTriggerEnabled = false;
5860

5961
O2ParamDef(FDDRecoConfig, "FDDRecoConfig");
60-
ClassDefNV(FDDRecoConfig, 1);
62+
ClassDefNV(FDDRecoConfig, 2);
6163
};
6264
} // namespace o2::fdd
6365
#endif

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,40 @@ class Reconstructor
4444
bool isInAmplitudeWindow(int16_t amplitude) {
4545
return amplitude >= FDDRecoConfig::Instance().ChannelAmplitudeLower && amplitude <= FDDRecoConfig::Instance().ChannelAmplitudeUpper;
4646
}
47+
bool isInTimeWindow(int16_t time) {
48+
return time >= FDDRecoConfig::Instance().ChannelTimeLower && time <= FDDRecoConfig::Instance().ChannelTimeUpper;
49+
}
50+
bool isChannelDataGood(uint8_t channelBits) {
51+
return FDDRecoConfig::Instance().isChannelDataGood(channelBits);
52+
}
53+
54+
bool isInCollisionTimeAmplitudeWindow(int16_t amplitude) {
55+
return amplitude >= FDDRecoConfig::Instance().CollisionTimeAmplitudeLower && amplitude <= FDDRecoConfig::Instance().CollisionTimeAmpltudeUpper;
56+
}
57+
bool isInCollisionTimeTimeWindow(int16_t time) {
58+
return time >= FDDRecoConfig::Instance().CollisionTimeTimeLower && time <= FDDRecoConfig::Instance().CollisionTimeTimeUpper;
59+
}
60+
bool isChannelDataGoodForCollisionTime(uint8_t channelBits) {
61+
return FDDRecoConfig::Instance().isChannelDataGoodForCollisionTime(channelBits);
62+
}
63+
64+
bool checkSwOrGateConditions(const ChannelData& channelData) {
65+
bool isAmplitudeInRange = channelData.mChargeADC >= FDDRecoConfig::Instance().SwTriggerAmplitudeLowThreshold
66+
&& channelData.mChargeADC <= FDDRecoConfig::Instance().SwTriggerAmplitudeHighThreshold;
67+
bool isInTimeWindow = std::abs(channelData.mTime) >= FDDRecoConfig::Instance().SwTriggerTimeLowThreshold
68+
&& std::abs(channeData.mTime) <= FDDRecoConfig::Instance().SwTriggerTimeHighThreshold;
69+
bool isCfdInAdcGate = channelData.getFlag(ChannelData::EEventDataBit::kIsCFDinADCgate);
70+
return isAmplitudeInRange && isInTimeWindow && isCfdInAdcGate;
71+
}
72+
73+
bool calculateSwTrigger(float meanTimeSideA, float meanTimeSideC, bool orGateSideA, bool orGateSideC)
74+
{
75+
return (meanTimeSideC - meanTimeSideA) >= FDDRecoConfig::SwTriggerTimeDiffMin
76+
&& (meanTimeSideC - meanTimeSideA) <= FDDRecoConfig::SwTriggerTimeDiffMax
77+
&& orGateSideA
78+
&& orGateSideC;
79+
}
80+
static constexpr uint8_t sSideAMaxId = 7;
4781

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

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

Lines changed: 38 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -42,69 +42,61 @@ void Reconstructor::process(o2::fdd::Digit const& digitBC, gsl::span<const o2::f
4242
int64_t timeSideC = 0;
4343
int64_t entriesNumSideA = 0;
4444
int64_t entriesNumSideC = 0;
45+
uint32_t storedEntries = 0;
46+
47+
bool swOrGateSideA = false;
48+
bool swOrGateSideC = false;
4549

4650
for (const auto& channelData: inChData) {
4751
if (mDeadChannelMap && !mDeadChannelMap->isChannelAlive(channelData.mPMNumber)) {
4852
LOG(debug) << "Channel " << channelData.mPMNumber << " is dead - discarding data";
4953
continue;
5054
}
51-
52-
}
5355

54-
for (int ich = 0; ich < nch; ich++) {
55-
if (mDeadChannelMap && !mDeadChannelMap->isChannelAlive(inChData[ich].mPMNumber)) {
56-
LOG(debug) << "Channel " << ich << " is dead - discarding data";
57-
continue;
58-
}
59-
bool inTime = inChData[ich].getFlag(ChannelData::EEventDataBit::kIsEventInTVDC);
60-
bool inAdcGate = inChData[ich].getFlag(ChannelData::EEventDataBit::kIsCFDinADCgate);
61-
if (inAdcGate) {
56+
if (isInAmplitudeWindow(channelData.mChargeADC)
57+
&& isInTimeWindow(channelData.mTime)
58+
&& isChannelDataGood(channelData.mFEEBits))
59+
{
6260
outChData.emplace_back((int)inChData[ich].mPMNumber, (inChData[ich].mTime) * timePerTDC,
6361
(double)inChData[ich].mChargeADC, inChData[ich].mFEEBits);
64-
nStored++;
62+
storedEntries++;
6563
}
66-
67-
float adc = inChData[ich].mChargeADC;
68-
float time = (inChData[ich].mTime) * timePerTDC;
69-
70-
float timeWeight = 1;
71-
if (adc > FDDRecoConfig::Instance().AmplitudeCutOnCollisionTimeWeights) {
72-
timeWeight = adc * adc;
64+
65+
if (FDDRecoConfig::Instance().SwTriggerEnabled) {
66+
if(channelData.mPMNumber <= sSideAMaxId) {
67+
swOrGateSideA |= checkSwOrGateConditions(channelData);
68+
} else {
69+
swOrGateSideC |= checkSwOrGateConditions(channelData);
70+
}
7371
}
74-
if ((int)inChData[ich].mPMNumber < 8) {
75-
nInTimeC += inTime;
76-
timeFDC += time * timeWeight;
77-
weightFDC += timeWeight;
72+
73+
if (!isInAmplitudeWindow(channelData.mChargeADC)
74+
|| !isInTimeWindow(channelData.mTime)
75+
|| !isChannelDataGood(channelData.mFEEBits)) {
76+
continue;
77+
}
78+
79+
if(channelData.mPMNumber <= sSideAMaxId) {
80+
timeSideA += channelData.mTime;
81+
entriesNumSideA++;
7882
} else {
79-
nInTimeA += inTime;
80-
timeFDA += time * timeWeight;
81-
weightFDA += timeWeight;
83+
timeSideC += channelData.mTime;
84+
entriesNumSideC++;
8285
}
83-
84-
atLeastOneVertexChannel = FDDRecoConfig::areChannelDataFlagsGood(inChData[ich].mFEEBits);
85-
atLeastOneChannelInSwAmplitudeRange = (adc >= FDDRecoConfig::SwTriggerAmplitudeLowThreshold && adc <= FDDRecoConfig::SwTriggerAmplitudeHighThreshold);
8686
}
87-
const int nsToPs = 1e3;
88-
std::array<int, 2> mCollisionTime = {o2::fdd::RecPoint::sDummyCollissionTime, o2::fdd::RecPoint::sDummyCollissionTime};
8987

90-
float meanTimeSideA = round(timeFDA / weightFDA * nsToPs);
91-
float meanTimeSideC = round(timeFDC / weightFDC * nsToPs);
92-
float sideTimeDifference = fabs(meanTimeSideC - meanTimeSideA);
93-
bool swTriggerBit = false;
94-
swTriggerBit = (
95-
FDDRecoConfig::SwTriggerEnabled &&
96-
(sideTimeDifference => FDDRecoConfig::SwTriggerTimeLowThreshold
97-
&& sideTimeDifference <= FDDRecoConfig::SwTriggerTimeHighThreshold
98-
&& atLeastOneVertexChannel
99-
&& atLeastOneChannelInSwAmplitudeRange
100-
)
101-
);
88+
constexpr float nsToPs = 1e3;
89+
float meanTimeSideA = std::round(float(timeSideA) * timePerTDC / float(entriesNumSideA));
90+
float meanTimeSideC = std::round(float(timeSideC) * timePerTDC / float(entriesNumSideC));
91+
92+
bool swVertexTrg = FDDRecoConfig::Instance().SwTriggerEnabled ? calculateSwTrigger(meanTimeSideA, meanTimeSideC, swOrGateSideA, swOrGateSideC) : false;
10293

103-
if (nInTimeA > 0 && weightFDA > FDDRecoConfig::Instance().AmplitudeCollisionTimeCutSideA) {
104-
mCollisionTime[o2::fdd::RecPoint::TimeA] = round(timeFDA / weightFDA * nsToPs);
94+
std::array<int, 2> mCollisionTime = {o2::fdd::RecPoint::sDummyCollissionTime, o2::fdd::RecPoint::sDummyCollissionTime};
95+
if (entriesSideA > 0) {
96+
mCollisionTime[o2::fdd::RecPoint::TimeA] = meanTimeSideA * nsToPs;
10597
}
106-
if (nInTimeC > 0 && weightFDC > FDDRecoConfig::Instance().AmplitudeCollisionTimeCutSideC) {
107-
mCollisionTime[o2::fdd::RecPoint::TimeC] = round(timeFDC / weightFDC * nsToPs);
98+
if (entriesSideC > 0) {
99+
mCollisionTime[o2::fdd::RecPoint::TimeC] = meanTimeSideC * nsToPs;
108100
}
109101
RecPoints.emplace_back(mCollisionTime, firstEntry, nStored, digitBC.getIntRecord(), digitBC.mTriggers);
110102
}

0 commit comments

Comments
 (0)