Skip to content

Commit 15a3914

Browse files
wpierozakwpierozak
authored andcommitted
Implemented coincidence mode; Renamed reco parameters
1 parent e716a5d commit 15a3914

4 files changed

Lines changed: 54 additions & 33 deletions

File tree

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,22 @@ struct FDDRecoConfig : o2::conf::ConfigurableParamHelper<FDDRecoConfig> {
4949
return (flags & CollisionTimeValidPmInputFlagMask) == CollisionTimeValidPmInputFlags;
5050
}
5151

52-
int16_t SwOrTriggerTimeLowThreshold = -153;
53-
int16_t SwOrTriggerTimeHighThreshold = 153;
54-
int16_t SwOrTriggerAmplitudeLowThreshold = 10;
55-
int16_t SwOrTriggerAmplitudeHighThreshold = 4096;
56-
int16_t SwVtxTriggerTimeDiffMin = -100;
57-
int16_t SwVtxTriggerTimeDiffMax = 100;
52+
int16_t SwOrGate = 153;
53+
int16_t SwOrTriggerAmplitudeLowThresholdSideA = 6;
54+
int16_t SwOrTriggerAmplitudeLowThresholdSideC = 0;
55+
int16_t SwOrTriggerAmplitudeHighThresholdSideA = 4095;
56+
int16_t SwOrTriggerAmplitudeHighThresholdSideC = 4095;
57+
int16_t SwVtxTriggerTimeWindow = 100;
58+
bool SwTriggerCoincidenceMode = true;
5859
bool SwTriggerEnabled = false;
5960

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));
63+
bool isChannelDataGoodForSwTrigger(uint8_t flags) const
64+
{
65+
return (flags & SwTriggerValidPmInputFlagMask) == SwTriggerValidPmInputFlags;
66+
}
67+
6068
O2ParamDef(FDDRecoConfig, "FDDRecoConfig");
6169
ClassDefNV(FDDRecoConfig, 2);
6270
};

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,19 @@ class RecPoint
5353
public:
5454
enum TimeTypeIndex : int { TimeA,
5555
TimeC };
56-
enum ETriggerBits { kSwVtxTrigger = 7 };
56+
enum ETriggerBits { kSwOrTrgSideA,
57+
kSwOrTrgSideC,
58+
kSwVtxTrg = 7 };
5759
RecPoint() = default;
5860
RecPoint(const std::array<int, 2>& collisiontime, int first, int ne,
59-
o2::InteractionRecord iRec, o2::fdd::Triggers triggers, bool swVertexTrigger)
61+
o2::InteractionRecord iRec, o2::fdd::Triggers triggers, bool swOrTrgSideA, bool swOrTrgSideC, bool swVtxTrg)
6062
: mCollisionTimePs(collisiontime)
6163
{
6264
mRef.setFirstEntry(first);
6365
mRef.setEntries(ne);
6466
mIntRecord = iRec;
6567
mTriggers = triggers;
66-
updateTriggers(swVertexTrigger);
68+
updateTriggers(swOrTrgSideA, swOrTrgSideC, swVtxTrg);
6769
}
6870
~RecPoint() = default;
6971

@@ -88,10 +90,10 @@ class RecPoint
8890
bool operator==(const RecPoint&) const = default;
8991

9092
private:
91-
void updateTriggers(bool swVertexTrigger)
93+
void updateTriggers(bool swOrTrgSideA, bool swOrTrgSideC, bool swVertexTrigger)
9294
{
9395
auto [triggerBits, technicalWords] = o2::fit::Triggers::parseDigitTriggerWord(mTriggers.getTriggersignals(), true);
94-
triggerBits |= (uint8_t(swVertexTrigger) << kSwVtxTrigger);
96+
triggerBits |= (uint8_t(swVertexTrigger) << kSwVtxTrg) | (uint8_t(swOrTrgSideA) << kSwOrTrgSideA) | (uint8_t(swOrTrgSideC) << kSwOrTrgSideC);
9597
mTriggers.setTriggers(triggerBits);
9698
mTechnicalWords = technicalWords;
9799
}

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

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,29 +42,33 @@ class Reconstructor
4242
}
4343

4444
private:
45-
static const int coincidencePairsSideC[4][2] = {{0, 4}, {1, 5}, {2, 6}, {3, 7}};
46-
static const int coincidencePairsSideA[4][2] = {{8, 12}, {9, 13}, {10, 14}, {11, 15}};
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};
4747

4848
bool isInAmplitudeWindow(int16_t amplitude)
4949
{
50-
return amplitude >= FDDRecoConfig::Instance().ChannelAmplitudeLower && amplitude <= FDDRecoConfig::Instance().ChannelAmplitudeUpper;
50+
return amplitude > FDDRecoConfig::Instance().ChannelAmplitudeLower && amplitude < FDDRecoConfig::Instance().ChannelAmplitudeUpper;
5151
}
5252
bool isInTimeWindow(int16_t time)
5353
{
54-
return time >= FDDRecoConfig::Instance().ChannelTimeLower && time <= FDDRecoConfig::Instance().ChannelTimeUpper;
54+
return time > FDDRecoConfig::Instance().ChannelTimeLower && time < FDDRecoConfig::Instance().ChannelTimeUpper;
5555
}
5656
bool isChannelDataGood(uint8_t channelBits)
5757
{
5858
return FDDRecoConfig::Instance().isChannelDataGood(channelBits);
5959
}
60+
bool isCoincidenceConditionFulFilled(const bool* coincidencePairs, uint8_t channelNumber)
61+
{
62+
return (!FDDRecoConfig::Instance().SwTriggerCoincidenceMode) || ((channelNumber <= sSideAMaxId) ? coincidencePairs[coincidencePairsSideA[channelNumber]] : coincidencePairs[coincidencePairsSideC[channelNumber]]);
63+
}
6064

6165
bool isInCollisionTimeAmplitudeWindow(int16_t amplitude)
6266
{
63-
return amplitude >= FDDRecoConfig::Instance().CollisionTimeAmplitudeLower && amplitude <= FDDRecoConfig::Instance().CollisionTimeAmpltudeUpper;
67+
return amplitude > FDDRecoConfig::Instance().CollisionTimeAmplitudeLower && amplitude < FDDRecoConfig::Instance().CollisionTimeAmpltudeUpper;
6468
}
6569
bool isInCollisionTimeTimeWindow(int16_t time)
6670
{
67-
return time >= FDDRecoConfig::Instance().CollisionTimeTimeLower && time <= FDDRecoConfig::Instance().CollisionTimeTimeUpper;
71+
return time > FDDRecoConfig::Instance().CollisionTimeTimeLower && time < FDDRecoConfig::Instance().CollisionTimeTimeUpper;
6872
}
6973
bool isChannelDataGoodForCollisionTime(uint8_t channelBits)
7074
{
@@ -73,15 +77,20 @@ class Reconstructor
7377

7478
bool checkSwOrGateConditions(const ChannelData& channelData)
7579
{
76-
bool isAmplitudeInRange = channelData.mChargeADC >= FDDRecoConfig::Instance().SwOrTriggerAmplitudeLowThreshold && channelData.mChargeADC <= FDDRecoConfig::Instance().SwOrTriggerAmplitudeHighThreshold;
77-
bool isInTimeWindow = std::abs(channelData.mTime) >= o2::fdd::timePerTDC * FDDRecoConfig::Instance().SwOrTriggerTimeLowThreshold && std::abs(channelData.mTime) <= o2::fdd::timePerTDC * FDDRecoConfig::Instance().SwOrTriggerTimeHighThreshold;
80+
bool isAmplitudeInRange = false;
81+
if (channelData.mPMNumber <= sSideAMaxId) {
82+
isAmplitudeInRange = channelData.mChargeADC > FDDRecoConfig::Instance().SwOrTriggerAmplitudeLowThresholdSideA && channelData.mChargeADC < FDDRecoConfig::Instance().SwOrTriggerAmplitudeHighThresholdSideA;
83+
} else {
84+
isAmplitudeInRange = channelData.mChargeADC > FDDRecoConfig::Instance().SwOrTriggerAmplitudeLowThresholdSideC && channelData.mChargeADC < FDDRecoConfig::Instance().SwOrTriggerAmplitudeHighThresholdSideC;
85+
}
86+
bool isInTimeWindow = std::abs(channelData.mTime) <= FDDRecoConfig::Instance().SwOrGate;
7887
bool isCfdInAdcGate = channelData.getFlag(ChannelData::EEventDataBit::kIsCFDinADCgate);
7988
return isAmplitudeInRange && isInTimeWindow && isCfdInAdcGate;
8089
}
8190

8291
bool calculateSwTrigger(float meanTimeSideA, float meanTimeSideC, bool orGateSideA, bool orGateSideC)
8392
{
84-
return (meanTimeSideC - meanTimeSideA) >= o2::fdd::timePerTDC * FDDRecoConfig::Instance().SwVtxTriggerTimeDiffMin && (meanTimeSideC - meanTimeSideA) <= o2::fdd::timePerTDC * FDDRecoConfig::Instance().SwVtxTriggerTimeDiffMax && orGateSideA && orGateSideC;
93+
return std::abs(meanTimeSideC - meanTimeSideA) < o2::fdd::timePerTDC * FDDRecoConfig::Instance().SwVtxTriggerTimeWindow && orGateSideA && orGateSideC;
8594
}
8695
static constexpr uint8_t sSideAMaxId = 7;
8796

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

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,30 +41,32 @@ void Reconstructor::process(o2::fdd::Digit const& digitBC, gsl::span<const o2::f
4141
bool swOrGateSideA = false;
4242
bool swOrGateSideC = false;
4343

44+
bool coincidencePairs[Nchannels] = {false};
45+
4446
for (const auto& channelData : inChData) {
4547
if (mDeadChannelMap && !mDeadChannelMap->isChannelAlive(channelData.mPMNumber)) {
4648
LOG(debug) << "Channel " << channelData.mPMNumber << " is dead - discarding data";
4749
continue;
4850
}
49-
50-
if (isInAmplitudeWindow(channelData.mChargeADC) && isInTimeWindow(channelData.mTime) && isChannelDataGood(channelData.mFEEBits)) {
51-
outChData.emplace_back((int)channelData.mPMNumber, (channelData.mTime) * timePerTDC,
52-
(double)channelData.mChargeADC, channelData.mFEEBits);
53-
storedEntries++;
51+
if (!isInAmplitudeWindow(channelData.mChargeADC) || !isInTimeWindow(channelData.mTime) || !isChannelDataGood(channelData.mFEEBits)) {
52+
continue;
5453
}
54+
const auto& chNum = channelData.mPMNumber;
55+
56+
outChData.emplace_back((int)chNum, (channelData.mTime) * timePerTDC,
57+
(double)channelData.mChargeADC, channelData.mFEEBits);
58+
storedEntries++;
5559

5660
if (FDDRecoConfig::Instance().SwTriggerEnabled) {
57-
if (channelData.mPMNumber <= sSideAMaxId) {
58-
swOrGateSideA |= checkSwOrGateConditions(channelData);
61+
if (chNum <= sSideAMaxId) {
62+
coincidencePairs[chNum] |= checkSwOrGateConditions(channelData);
63+
swOrGateSideA |= coincidencePairs[chNum] && isCoincidenceConditionFulFilled(coincidencePairs, chNum);
5964
} else {
60-
swOrGateSideC |= checkSwOrGateConditions(channelData);
65+
coincidencePairs[chNum] |= checkSwOrGateConditions(channelData);
66+
swOrGateSideC |= coincidencePairs[chNum] && isCoincidenceConditionFulFilled(coincidencePairs, chNum);
6167
}
6268
}
6369

64-
if (!isInAmplitudeWindow(channelData.mChargeADC) || !isInTimeWindow(channelData.mTime) || !isChannelDataGood(channelData.mFEEBits)) {
65-
continue;
66-
}
67-
6870
if (channelData.mPMNumber <= sSideAMaxId) {
6971
timeSideA += channelData.mTime;
7072
entriesNumSideA++;
@@ -87,7 +89,7 @@ void Reconstructor::process(o2::fdd::Digit const& digitBC, gsl::span<const o2::f
8789
if (entriesNumSideC > 0) {
8890
mCollisionTime[o2::fdd::RecPoint::TimeC] = std::round(meanTimeSideC * nsToPs);
8991
}
90-
RecPoints.emplace_back(mCollisionTime, firstEntry, storedEntries, digitBC.getIntRecord(), digitBC.mTriggers, swVertexTrg);
92+
RecPoints.emplace_back(mCollisionTime, firstEntry, storedEntries, digitBC.getIntRecord(), digitBC.mTriggers, swVertexTrg, swOrGateSideA, swOrGateSideC);
9193
}
9294
//________________________________________________________
9395
void Reconstructor::finish()

0 commit comments

Comments
 (0)