Skip to content

Commit 64c5bb7

Browse files
committed
AOD: protoype TRD signal and eProb encoding
Note to self: think about inverse-log encoding pid signal and give 8 more bits to dEdx. Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch>
1 parent ff118eb commit 64c5bb7

File tree

3 files changed

+86
-6
lines changed

3 files changed

+86
-6
lines changed

Detectors/AOD/include/AODProducerWorkflow/AODProducerWorkflowSpec.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ class AODProducerWorkflowDPL : public Task
404404
float trdChi2 = -999.f;
405405
float tofChi2 = -999.f;
406406
float tpcSignal = -999.f;
407-
float trdSignal = -999.f;
407+
float trdSignal = aod::track::extensions::TRDSignalEncoding::invalidSignal;
408408
float length = -999.f;
409409
float tofExpMom = -999.f;
410410
float trackEtaEMCAL = -999.f;
@@ -524,7 +524,7 @@ class AODProducerWorkflowDPL : public Task
524524
void addToTracksQATable(TracksQACursorType& tracksQACursor, TrackQA& trackQAInfoHolder);
525525

526526
template <typename TRDsExtraCursorType>
527-
void addToTRDsExtra(const o2::globaltracking::RecoContainer& recoData, TRDsExtraCursorType& trdExtraCursor, const GIndex& trkIdx, int trkTableIdx);
527+
void addToTRDsExtra(const o2::globaltracking::RecoContainer& recoData, TRDsExtraCursorType& trdExtraCursor, const GIndex& trkIdx, TrackExtraInfo& extraInfo, int trkTableIdx);
528528

529529
template <typename mftTracksCursorType, typename AmbigMFTTracksCursorType>
530530
void addToMFTTracksTable(mftTracksCursorType& mftTracksCursor, AmbigMFTTracksCursorType& ambigMFTTracksCursor,

Detectors/AOD/src/AODProducerWorkflowSpec.cxx

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ void AODProducerWorkflowDPL::addToTracksExtraTable(TracksExtraCursorType& tracks
349349
truncateFloatFraction(extraInfoHolder.trdChi2, mTrackChi2),
350350
truncateFloatFraction(extraInfoHolder.tofChi2, mTrackChi2),
351351
truncateFloatFraction(extraInfoHolder.tpcSignal, mTrackSignal),
352-
truncateFloatFraction(extraInfoHolder.trdSignal, mTrackSignal),
352+
extraInfoHolder.trdSignal,
353353
truncateFloatFraction(extraInfoHolder.length, mTrackSignal),
354354
truncateFloatFraction(extraInfoHolder.tofExpMom, mTrack1Pt),
355355
truncateFloatFraction(extraInfoHolder.trackEtaEMCAL, mTrackPosEMCAL),
@@ -390,7 +390,7 @@ void AODProducerWorkflowDPL::addToTracksQATable(TracksQACursorType& tracksQACurs
390390
}
391391

392392
template <typename TRDsExtraCursorType>
393-
void AODProducerWorkflowDPL::addToTRDsExtra(const o2::globaltracking::RecoContainer& recoData, TRDsExtraCursorType& trdExtraCursor, const GIndex& trkIdx, int trkTableIdx)
393+
void AODProducerWorkflowDPL::addToTRDsExtra(const o2::globaltracking::RecoContainer& recoData, TRDsExtraCursorType& trdExtraCursor, const GIndex& trkIdx, TrackExtraInfo& extraInfo, int trkTableIdx)
394394
{
395395
static int q0s[6] = {-1}, q1s[6] = {-1}, q2s[6] = {-1};
396396
static float q0sCor[6] = {-1}, q1sCor[6] = {-1}, q2sCor[6] = {-1};
@@ -404,6 +404,7 @@ void AODProducerWorkflowDPL::addToTRDsExtra(const o2::globaltracking::RecoContai
404404
auto trkC = trk;
405405
const auto& trklets = recoData.getTRDTracklets();
406406
const auto& ctrklets = recoData.getTRDCalibratedTracklets();
407+
407408
for (int iLay{0}; iLay < 6; ++iLay) {
408409
q0s[iLay] = q1s[iLay] = q2s[iLay] = -1;
409410
q0sCor[iLay] = q1sCor[iLay] = q2sCor[iLay] = -1;
@@ -459,6 +460,23 @@ void AODProducerWorkflowDPL::addToTRDsExtra(const o2::globaltracking::RecoContai
459460
}
460461
}
461462

463+
aod::track::extensions::TRDSignalEncoding enc;
464+
465+
// dEdX signal
466+
float integral{0.}, ntracklets{0.};
467+
for (int i{0}; i < 6; ++i) {
468+
if (q0sCor[i] > 0) {
469+
integral += (q0sCor[i] + q1sCor[i] + q2sCor[i]);
470+
++ntracklets;
471+
}
472+
}
473+
enc.setDEdx(integral / ntracklets);
474+
475+
// pid signal
476+
// TODO
477+
478+
extraInfo.trdSignal = enc.getSignal();
479+
462480
trdExtraCursor(trkTableIdx, q0s, q1s, q2s, q0sCor, q1sCor, q2sCor, ttgls, tphis);
463481
}
464482

@@ -612,12 +630,13 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
612630
if (!isProp) {
613631
addToTracksTable(tracksCursor, tracksCovCursor, trOrig, collisionID, aod::track::TrackIU);
614632
}
615-
addToTracksExtraTable(tracksExtraCursor, extraInfoHolder);
616633

617634
if (mEnableTRDextra && trackIndex.includesDet(GIndex::Source::TRD)) {
618-
addToTRDsExtra(data, trdsExtraCursor, trackIndex, mTableTrID);
635+
addToTRDsExtra(data, trdsExtraCursor, trackIndex, extraInfoHolder, mTableTrID);
619636
}
620637

638+
addToTracksExtraTable(tracksExtraCursor, extraInfoHolder);
639+
621640
// collecting table indices of barrel tracks for V0s table
622641
if (extraInfoHolder.bcSlice[0] >= 0 && collisionID < 0) {
623642
ambigTracksCursor(mTableTrID, extraInfoHolder.bcSlice);

Framework/Core/include/Framework/DataTypes.h

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ enum TRDTrackPattern : uint8_t {
7676
HasNeighbor = 0x40,
7777
HasCrossing = 0x80,
7878
};
79+
7980
namespace extensions
8081
{
8182
struct TPCTimeErrEncoding {
@@ -121,6 +122,66 @@ struct TPCTimeErrEncoding {
121122
return static_cast<float>(encoding.deltas.timeBackward) / timeScaler * TPCBinNS;
122123
}
123124
};
125+
126+
class TRDSignalEncoding
127+
{
128+
union {
129+
float signal{0};
130+
struct {
131+
uint16_t dEdx{0}; // range [0., 256.)
132+
uint16_t eProb{0}; // range [0., 1.)
133+
} __attribute((packed)) data;
134+
} encoding{0};
135+
static_assert(sizeof(float) == 2 * sizeof(uint16_t));
136+
137+
public:
138+
static constexpr float dEdxMax{(1 << 8)};
139+
static constexpr float dEdxScaler{(1 << 16) / dEdxMax};
140+
static constexpr float eProbMax{1.};
141+
static constexpr float eProbScaler{(1 << 16) / eProbMax};
142+
// results in valid values, so we mark this and return 0.
143+
// also luckily -999.f is accurately represented even if
144+
// truncated by mantissa bits so all on-disk signals are accurate.
145+
static constexpr float invalidSignal{-999.f};
146+
147+
void setSignal(float signal)
148+
{
149+
if (signal == invalidSignal) {
150+
encoding.signal = 0.f;
151+
} else {
152+
encoding.signal = signal;
153+
}
154+
}
155+
156+
void setDEdx(float v)
157+
{
158+
if (v >= 0. && v < dEdxMax) {
159+
encoding.data.dEdx = static_cast<uint16_t>(v * dEdxScaler);
160+
}
161+
}
162+
void setEProb(float v)
163+
{
164+
if (v >= 0. && v < eProbMax) {
165+
encoding.data.eProb = static_cast<uint16_t>(v * eProbScaler);
166+
}
167+
}
168+
169+
float getSignal() const noexcept
170+
{
171+
return encoding.signal;
172+
}
173+
174+
float getDEdx() const noexcept
175+
{
176+
return static_cast<float>(encoding.data.dEdx) / dEdxScaler;
177+
}
178+
179+
float getEProb() const noexcept
180+
{
181+
return static_cast<float>(encoding.data.eProb) / eProbScaler;
182+
}
183+
};
184+
124185
} // namespace extensions
125186

126187
// Reference radius for extrapolated tracks

0 commit comments

Comments
 (0)