Skip to content

Commit 1521406

Browse files
Wiktor Pierozakwpierozak
authored andcommitted
Draft of FDD reco refactor
1 parent ab59052 commit 1521406

3 files changed

Lines changed: 51 additions & 26 deletions

File tree

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,28 @@
1313
#define ALICEO2_FDD_RECO_PARAM
1414

1515
#include "CommonUtils/ConfigurableParamHelper.h"
16+
#include "DataFormatsFDD/ChannelData.h"
1617

1718
namespace o2::fdd
1819
{
1920
struct FDDRecoConfig : o2::conf::ConfigurableParamHelper<FDDRecoConfig> {
2021
float AmplitudeCutOnCollisionTimeWeights = 3;
22+
float AmplitudeCollisionTimeCutSideA = 1.0;
23+
float AmplitudeCollisionTimeCutSideC = 0.0;
24+
25+
float SwTriggerTimeLowThreshold= -1.25;
26+
float SwTriggerTimeHighThreshold= 1.25;
27+
float SwTriggerAmplitudeLowThreshold = 0.0;
28+
float SwTriggerAmplitudeHighThreshold = 4096.0;
29+
bool SwTriggerEnabled = false;
30+
31+
uint8_t ValidPmInputFlagMask = static_cast<uint8_t>(~(1u << ChannelData::kNumberADC));
32+
uint8_t ValidPmInputFlags = static_cast<uint8_t>((1u << ChannelData::kIsCFDinADCgate) | (1u << ChannelData::kIsEventInTVDC));
33+
bool areChannelDataFlagsGood(uint8_t flags) const
34+
{
35+
return (flags & mValidPmInputFlagMask) == mValidPmInputFlags;
36+
}
37+
2138
O2ParamDef(FDDRecoConfig, "FDDRecoConfig");
2239
ClassDefNV(FDDRecoConfig, 1);
2340
};

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class RecPoint
5353
public:
5454
enum TimeTypeIndex : int { TimeA,
5555
TimeC };
56+
enum ETriggerBits { kSwTrigger = 7 };
5657
RecPoint() = default;
5758
RecPoint(const std::array<int, 2>& collisiontime, int first, int ne,
5859
o2::InteractionRecord iRec, o2::fdd::Triggers triggers)

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

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ void Reconstructor::process(o2::fdd::Digit const& digitBC, gsl::span<const o2::f
3535
int nStored = 0;
3636
int nch = inChData.size();
3737

38+
bool atLeastOneVertexChannel = false;
39+
bool atLeastOneChannelInSwAmplitudeRange = false;
40+
3841
for (int ich = 0; ich < nch; ich++) {
3942
if (mDeadChannelMap && !mDeadChannelMap->isChannelAlive(inChData[ich].mPMNumber)) {
4043
LOG(debug) << "Channel " << ich << " is dead - discarding data";
@@ -48,43 +51,47 @@ void Reconstructor::process(o2::fdd::Digit const& digitBC, gsl::span<const o2::f
4851
nStored++;
4952
}
5053

51-
Float_t adc = inChData[ich].mChargeADC;
52-
Float_t time = (inChData[ich].mTime) * timePerTDC;
53-
if (time == o2::InteractionRecord::DummyTime) {
54-
continue;
55-
}
56-
Float_t timeErr = 1;
54+
float adc = inChData[ich].mChargeADC;
55+
float time = (inChData[ich].mTime) * timePerTDC;
56+
57+
float timeWeight = 1;
5758
if (adc > FDDRecoConfig::Instance().AmplitudeCutOnCollisionTimeWeights) {
58-
timeErr = 1. / adc;
59+
timeWeight = adc * adc;
5960
}
6061
if ((int)inChData[ich].mPMNumber < 8) {
6162
nInTimeC += inTime;
62-
timeFDC += time / (timeErr * timeErr);
63-
weightFDC += 1. / (timeErr * timeErr);
63+
timeFDC += time * timeWeight;
64+
weightFDC += timeWeight;
6465
} else {
6566
nInTimeA += inTime;
66-
timeFDA += time / (timeErr * timeErr);
67-
weightFDA += 1. / (timeErr * timeErr);
67+
timeFDA += time * timeWeight;
68+
weightFDA += timeWeight;
6869
}
70+
71+
atLeastOneVertexChannel = FDDRecoConfig::areChannelDataFlagsGood(inChData[ich].mFEEBits);
72+
atLeastOneChannelInSwAmplitudeRange = (adc >= FDDRecoConfig::SwTriggerAmplitudeLowThreshold && adc <= FDDRecoConfig::SwTriggerAmplitudeHighThreshold);
6973
}
7074
const int nsToPs = 1e3;
7175
std::array<int, 2> mCollisionTime = {o2::fdd::RecPoint::sDummyCollissionTime, o2::fdd::RecPoint::sDummyCollissionTime};
72-
/// Avg time for each side, only if one channel satisfy the TVDC condition (if not, also avg time is propagated for background study using AO2D)
73-
if (nInTimeA > 0) {
74-
mCollisionTime[o2::fdd::RecPoint::TimeA] = (weightFDA > 1) ? round(timeFDA / weightFDA * nsToPs)
75-
: o2::fdd::RecPoint::sDummyCollissionTime;
76-
} else {
77-
if (weightFDA > 0) {
78-
mCollisionTime[o2::fdd::RecPoint::TimeA] = round(timeFDA / weightFDA * nsToPs);
79-
}
76+
77+
float meanTimeSideA = round(timeFDA / weightFDA * nsToPs);
78+
float meanTimeSideC = round(timeFDC / weightFDC * nsToPs);
79+
float sideTimeDifference = fabs(meanTimeSideC - meanTimeSideA);
80+
bool swTriggerBit = false;
81+
swTriggerBit = (
82+
FDDRecoConfig::SwTriggerEnabled &&
83+
(sideTimeDifference => FDDRecoConfig::SwTriggerTimeLowThreshold
84+
&& sideTimeDifference <= FDDRecoConfig::SwTriggerTimeHighThreshold
85+
&& atLeastOneVertexChannel
86+
&& atLeastOneChannelInSwAmplitudeRange
87+
)
88+
);
89+
90+
if (nInTimeA > 0 && weightFDA > FDDRecoConfig::Instance().AmplitudeCollisionTimeCutSideA) {
91+
mCollisionTime[o2::fdd::RecPoint::TimeA] = round(timeFDA / weightFDA * nsToPs);
8092
}
81-
if (nInTimeC > 0) {
82-
mCollisionTime[o2::fdd::RecPoint::TimeC] = (weightFDC > 1) ? round(timeFDC / weightFDC * nsToPs)
83-
: o2::fdd::RecPoint::sDummyCollissionTime;
84-
} else {
85-
if (weightFDC > 0) {
86-
mCollisionTime[o2::fdd::RecPoint::TimeC] = round(timeFDC / weightFDC * nsToPs);
87-
}
93+
if (nInTimeC > 0 && weightFDC > FDDRecoConfig::Instance().AmplitudeCollisionTimeCutSideC) {
94+
mCollisionTime[o2::fdd::RecPoint::TimeC] = round(timeFDC / weightFDC * nsToPs);
8895
}
8996
RecPoints.emplace_back(mCollisionTime, firstEntry, nStored, digitBC.getIntRecord(), digitBC.mTriggers);
9097
}

0 commit comments

Comments
 (0)