Skip to content

Commit a3fef38

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 a3fef38

File tree

4 files changed

+105
-9
lines changed

4 files changed

+105
-9
lines changed

Detectors/AOD/include/AODProducerWorkflow/AODProducerWorkflowSpec.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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: 27 additions & 7 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, // byte encoded value do not truncate
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,7 +460,26 @@ void AODProducerWorkflowDPL::addToTRDsExtra(const o2::globaltracking::RecoContai
459460
}
460461
}
461462

462-
trdExtraCursor(trkTableIdx, q0s, q1s, q2s, q0sCor, q1sCor, q2sCor, ttgls, tphis);
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+
enc.setEProb(trk.getSignal());
477+
478+
extraInfo.trdSignal = enc.getSignal();
479+
480+
if (mEnableTRDextra) {
481+
trdExtraCursor(trkTableIdx, q0s, q1s, q2s, q0sCor, q1sCor, q2sCor, ttgls, tphis);
482+
}
463483
}
464484

465485
template <typename mftTracksCursorType, typename AmbigMFTTracksCursorType>
@@ -612,12 +632,13 @@ void AODProducerWorkflowDPL::fillTrackTablesPerCollision(int collisionID,
612632
if (!isProp) {
613633
addToTracksTable(tracksCursor, tracksCovCursor, trOrig, collisionID, aod::track::TrackIU);
614634
}
615-
addToTracksExtraTable(tracksExtraCursor, extraInfoHolder);
616635

617-
if (mEnableTRDextra && trackIndex.includesDet(GIndex::Source::TRD)) {
618-
addToTRDsExtra(data, trdsExtraCursor, trackIndex, mTableTrID);
636+
if (trackIndex.includesDet(GIndex::Source::TRD)) {
637+
addToTRDsExtra(data, trdsExtraCursor, trackIndex, extraInfoHolder, mTableTrID);
619638
}
620639

640+
addToTracksExtraTable(tracksExtraCursor, extraInfoHolder);
641+
621642
// collecting table indices of barrel tracks for V0s table
622643
if (extraInfoHolder.bcSlice[0] >= 0 && collisionID < 0) {
623644
ambigTracksCursor(mTableTrID, extraInfoHolder.bcSlice);
@@ -2606,7 +2627,6 @@ AODProducerWorkflowDPL::TrackExtraInfo AODProducerWorkflowDPL::processBarrelTrac
26062627
if (contributorsGID[GIndex::Source::TRD].isIndexSet()) { // ITS-TPC-TRD-TOF, TPC-TRD-TOF, TPC-TRD, ITS-TPC-TRD
26072628
const auto& trdOrig = data.getTrack<o2::trd::TrackTRD>(contributorsGID[GIndex::Source::TRD]); // refitted TRD trac
26082629
extraInfoHolder.trdChi2 = trdOrig.getChi2();
2609-
extraInfoHolder.trdSignal = trdOrig.getSignal();
26102630
extraInfoHolder.trdPattern = getTRDPattern(trdOrig);
26112631
if (extraInfoHolder.trackTimeRes < 0.) { // time is not set yet, this is possible only for TPC-TRD and ITS-TPC-TRD tracks, since those with TOF are set upstream
26122632
// TRD is triggered: time uncertainty is within a BC

Framework/Core/include/Framework/AnalysisDataModel.h

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,23 @@ DECLARE_SOA_DYNAMIC_COLUMN(TPCDeltaTBwd, tpcDeltaTBwd, //! Delta Backward of tra
394394

395395
} // namespace v001
396396

397+
namespace v002::extensions
398+
{
399+
using TRDEncoding = o2::aod::track::extensions::TRDSignalEncoding;
400+
DECLARE_SOA_DYNAMIC_COLUMN(TRDDEdx, trdDEDx, //! TRD dEdx signal (a.u.), returns 0. if no valid signal is provided
401+
[](float signal) -> float {
402+
TRDEncoding enc;
403+
enc.setSignal(signal);
404+
return enc.getDEdx();
405+
});
406+
DECLARE_SOA_DYNAMIC_COLUMN(TRDEProb, trdEProb, //! TRD electron probability [0., 1.), returns 0. if no valid signal is provided
407+
[](float signal) -> float {
408+
TRDEncoding enc;
409+
enc.setSignal(signal);
410+
return enc.getDEdx();
411+
});
412+
} // namespace v002::extensions
413+
397414
DECLARE_SOA_DYNAMIC_COLUMN(HasITS, hasITS, //! Flag to check if track has a ITS match
398415
[](uint8_t detectorMap) -> bool { return detectorMap & o2::aod::track::ITS; });
399416
DECLARE_SOA_DYNAMIC_COLUMN(HasTPC, hasTPC, //! Flag to check if track has a TPC match
@@ -617,7 +634,9 @@ DECLARE_SOA_TABLE_FULL_VERSIONED(StoredTracksExtra_002, "TracksExtra", "AOD", "T
617634
track::TPCNClsFindable, track::TPCNClsFindableMinusFound, track::TPCNClsFindableMinusPID, track::TPCNClsFindableMinusCrossedRows,
618635
track::TPCNClsShared, track::v001::extensions::TPCDeltaTFwd<track::TrackTimeRes, track::Flags>, track::v001::extensions::TPCDeltaTBwd<track::TrackTimeRes, track::Flags>,
619636
track::TRDPattern, track::ITSChi2NCl, track::TPCChi2NCl, track::TRDChi2, track::TOFChi2,
620-
track::TPCSignal, track::TRDSignal, track::Length, track::TOFExpMom,
637+
track::TPCSignal,
638+
track::TRDSignal, track::v002::extensions::TRDDEdx<track::TRDSignal>, track::v002::extensions::TRDEProb<track::TRDSignal>,
639+
track::Length, track::TOFExpMom,
621640
track::PIDForTracking<track::Flags>,
622641
track::IsPVContributor<track::Flags>,
623642
track::HasITS<track::v001::DetectorMap>, track::HasTPC<track::v001::DetectorMap>,

Framework/Core/include/Framework/DataTypes.h

Lines changed: 57 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,62 @@ 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{256.f};
139+
static constexpr float dEdxScaler{(1 << 16) / dEdxMax};
140+
static constexpr float eProbMax{1.f};
141+
static constexpr float eProbScaler{(1 << 16) / eProbMax};
142+
143+
void setSignal(float signal)
144+
{
145+
encoding.signal = (signal < 0.f) ? 0.f : signal;
146+
}
147+
148+
void setDEdx(float v)
149+
{
150+
if (v >= 0. && v < dEdxMax) {
151+
encoding.data.dEdx = static_cast<uint16_t>(v * dEdxScaler);
152+
} else {
153+
encoding.data.dEdx = 0.f;
154+
}
155+
}
156+
void setEProb(float v)
157+
{
158+
if (v >= 0. && v < eProbMax) {
159+
encoding.data.eProb = static_cast<uint16_t>(v * eProbScaler);
160+
} else {
161+
encoding.data.eProb = 0.f;
162+
}
163+
}
164+
165+
float getSignal() const noexcept
166+
{
167+
return encoding.signal;
168+
}
169+
170+
float getDEdx() const noexcept
171+
{
172+
return static_cast<float>(encoding.data.dEdx) / dEdxScaler;
173+
}
174+
175+
float getEProb() const noexcept
176+
{
177+
return static_cast<float>(encoding.data.eProb) / eProbScaler;
178+
}
179+
};
180+
124181
} // namespace extensions
125182

126183
// Reference radius for extrapolated tracks

0 commit comments

Comments
 (0)