@@ -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// ________________________________________________________
95125void Reconstructor::finish ()
0 commit comments