Skip to content

Commit f27404e

Browse files
committed
AOD TrackQA stores track.dEdxAlt.dEdxTPCTot used for its dEdx info normalization
When filling AOD extra track info, the TPCSignal and the number of clusters used for PID are overridden to those coming from the TrackTPC::dEdxAlt if the nominal dEdx.dEdxTotTPC==0. This is flagged by extraInfo.flags |= o2::aod::track::TPCdEdxAlt The ratio is stored with the same precision as the nominal dEdxAlt.dEdxTPCTot in the extraInfo.TPCSignal. +Extra fixes like clamping to uint8_t instead of casting float to it.
1 parent 2dc461b commit f27404e

File tree

4 files changed

+39
-13
lines changed

4 files changed

+39
-13
lines changed

Detectors/AOD/include/AODProducerWorkflow/AODProducerWorkflowSpec.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,7 @@ class AODProducerWorkflowDPL : public Task
413413
struct TrackQA {
414414
GID trackID;
415415
float tpcTime0{};
416+
float tpcdEdxNorm{};
416417
int16_t tpcdcaR{};
417418
int16_t tpcdcaZ{};
418419
uint8_t tpcClusterByteMask{};

Detectors/AOD/src/AODProducerWorkflowSpec.cxx

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,7 @@ void AODProducerWorkflowDPL::addToTracksQATable(TracksQACursorType& tracksQACurs
362362
tracksQACursor(
363363
trackQAInfoHolder.trackID,
364364
truncateFloatFraction(trackQAInfoHolder.tpcTime0, mTPCTime0),
365+
truncateFloatFraction(trackQAInfoHolder.tpcdEdxNorm, mTrackSignal),
365366
trackQAInfoHolder.tpcdcaR,
366367
trackQAInfoHolder.tpcdcaZ,
367368
trackQAInfoHolder.tpcClusterByteMask,
@@ -2542,14 +2543,18 @@ AODProducerWorkflowDPL::TrackExtraInfo AODProducerWorkflowDPL::processBarrelTrac
25422543
if (contributorsGID[GIndex::Source::TPC].isIndexSet()) {
25432544
const auto& tpcOrig = data.getTPCTrack(contributorsGID[GIndex::TPC]);
25442545
const auto& tpcClData = mTPCCounters[contributorsGID[GIndex::TPC]];
2546+
const auto& dEdx = tpcOrig.getdEdx().dEdxTotTPC > 0 ? tpcOrig.getdEdx() : tpcOrig.getdEdxAlt();
2547+
if (tpcOrig.getdEdx().dEdxTotTPC == 0) {
2548+
extraInfoHolder.flags |= o2::aod::track::TPCdEdxAlt;
2549+
}
25452550
extraInfoHolder.tpcInnerParam = tpcOrig.getP() / tpcOrig.getAbsCharge();
25462551
extraInfoHolder.tpcChi2NCl = tpcOrig.getNClusters() ? tpcOrig.getChi2() / tpcOrig.getNClusters() : 0;
2547-
extraInfoHolder.tpcSignal = tpcOrig.getdEdx().dEdxTotTPC;
2552+
extraInfoHolder.tpcSignal = dEdx.dEdxTotTPC;
25482553
extraInfoHolder.tpcNClsFindable = tpcOrig.getNClusters();
25492554
extraInfoHolder.tpcNClsFindableMinusFound = tpcOrig.getNClusters() - tpcClData.found;
25502555
extraInfoHolder.tpcNClsFindableMinusCrossedRows = tpcOrig.getNClusters() - tpcClData.crossed;
25512556
extraInfoHolder.tpcNClsShared = tpcClData.shared;
2552-
uint32_t clsUsedForPID = tpcOrig.getdEdx().NHitsIROC + tpcOrig.getdEdx().NHitsOROC1 + tpcOrig.getdEdx().NHitsOROC2 + tpcOrig.getdEdx().NHitsOROC3;
2557+
uint32_t clsUsedForPID = dEdx.NHitsIROC + dEdx.NHitsOROC1 + dEdx.NHitsOROC2 + dEdx.NHitsOROC3;
25532558
extraInfoHolder.tpcNClsFindableMinusPID = tpcOrig.getNClusters() - clsUsedForPID;
25542559
if (src == GIndex::TPC) { // standalone TPC track should set its time from their timebins range
25552560
if (needBCSlice) {
@@ -2605,6 +2610,11 @@ AODProducerWorkflowDPL::TrackQA AODProducerWorkflowDPL::processBarrelTrackQA(int
26052610
using ValType = decltype(value);
26062611
return static_cast<int8_t>(TMath::Nint(std::clamp(value, static_cast<ValType>(std::numeric_limits<int8_t>::min()), static_cast<ValType>(std::numeric_limits<int8_t>::max()))));
26072612
};
2613+
auto safeUInt8Clamp = [](auto value) -> uint8_t {
2614+
using ValType = decltype(value);
2615+
return static_cast<uint8_t>(TMath::Nint(std::clamp(value, static_cast<ValType>(std::numeric_limits<uint8_t>::min()), static_cast<ValType>(std::numeric_limits<uint8_t>::max()))));
2616+
};
2617+
26082618
/// get tracklet byteMask
26092619
uint8_t clusterCounters[8] = {0};
26102620
{
@@ -2625,16 +2635,18 @@ AODProducerWorkflowDPL::TrackQA AODProducerWorkflowDPL::processBarrelTrackQA(int
26252635
}
26262636
trackQAHolder.tpcTime0 = tpcOrig.getTime0();
26272637
trackQAHolder.tpcClusterByteMask = byteMask;
2628-
const float dEdxNorm = (tpcOrig.getdEdx().dEdxTotTPC > 0) ? 100. / tpcOrig.getdEdx().dEdxTotTPC : 0;
2629-
trackQAHolder.tpcdEdxMax0R = uint8_t(tpcOrig.getdEdx().dEdxMaxIROC * dEdxNorm);
2630-
trackQAHolder.tpcdEdxMax1R = uint8_t(tpcOrig.getdEdx().dEdxMaxOROC1 * dEdxNorm);
2631-
trackQAHolder.tpcdEdxMax2R = uint8_t(tpcOrig.getdEdx().dEdxMaxOROC2 * dEdxNorm);
2632-
trackQAHolder.tpcdEdxMax3R = uint8_t(tpcOrig.getdEdx().dEdxMaxOROC3 * dEdxNorm);
2638+
const auto& dEdxInfoAlt = tpcOrig.getdEdxAlt(); // tpcOrig.getdEdx()
2639+
const float dEdxNorm = (dEdxInfoAlt.dEdxTotTPC > 0) ? 100. / dEdxInfoAlt.dEdxTotTPC : 0;
2640+
trackQAHolder.tpcdEdxNorm = dEdxInfoAlt.dEdxTotTPC;
2641+
trackQAHolder.tpcdEdxMax0R = safeUInt8Clamp(dEdxInfoAlt.dEdxMaxIROC * dEdxNorm);
2642+
trackQAHolder.tpcdEdxMax1R = safeUInt8Clamp(dEdxInfoAlt.dEdxMaxOROC1 * dEdxNorm);
2643+
trackQAHolder.tpcdEdxMax2R = safeUInt8Clamp(dEdxInfoAlt.dEdxMaxOROC2 * dEdxNorm);
2644+
trackQAHolder.tpcdEdxMax3R = safeUInt8Clamp(dEdxInfoAlt.dEdxMaxOROC3 * dEdxNorm);
26332645
//
2634-
trackQAHolder.tpcdEdxTot0R = uint8_t(tpcOrig.getdEdx().dEdxTotIROC * dEdxNorm);
2635-
trackQAHolder.tpcdEdxTot1R = uint8_t(tpcOrig.getdEdx().dEdxTotOROC1 * dEdxNorm);
2636-
trackQAHolder.tpcdEdxTot2R = uint8_t(tpcOrig.getdEdx().dEdxTotOROC2 * dEdxNorm);
2637-
trackQAHolder.tpcdEdxTot3R = uint8_t(tpcOrig.getdEdx().dEdxTotOROC3 * dEdxNorm);
2646+
trackQAHolder.tpcdEdxTot0R = safeUInt8Clamp(dEdxInfoAlt.dEdxTotIROC * dEdxNorm);
2647+
trackQAHolder.tpcdEdxTot1R = safeUInt8Clamp(dEdxInfoAlt.dEdxTotOROC1 * dEdxNorm);
2648+
trackQAHolder.tpcdEdxTot2R = safeUInt8Clamp(dEdxInfoAlt.dEdxTotOROC2 * dEdxNorm);
2649+
trackQAHolder.tpcdEdxTot3R = safeUInt8Clamp(dEdxInfoAlt.dEdxTotOROC3 * dEdxNorm);
26382650
///
26392651
float scaleTOF{0};
26402652
auto contributorsGIDA = data.getSingleDetectorRefs(trackIndex);
@@ -2705,6 +2717,7 @@ AODProducerWorkflowDPL::TrackQA AODProducerWorkflowDPL::processBarrelTrackQA(int
27052717
<< "scaleGlo3=" << scaleGlo(3)
27062718
<< "scaleGlo4=" << scaleGlo(4)
27072719
<< "trackQAHolder.tpcTime0=" << trackQAHolder.tpcTime0
2720+
<< "trackQAHolder.tpcdEdxNorm=" << trackQAHolder.tpcdEdxNorm
27082721
<< "trackQAHolder.tpcdcaR=" << trackQAHolder.tpcdcaR
27092722
<< "trackQAHolder.tpcdcaZ=" << trackQAHolder.tpcdcaZ
27102723
<< "trackQAHolder.tpcdcaClusterByteMask=" << trackQAHolder.tpcClusterByteMask

Framework/Core/include/Framework/AnalysisDataModel.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -680,10 +680,11 @@ namespace trackqa
680680
// TRACKQA TABLE COLUMNS
681681
DECLARE_SOA_INDEX_COLUMN(Track, track); //! track to which this QA information belongs
682682
DECLARE_SOA_COLUMN(TPCTime0, tpcTime0, float); //! tpc only time0 (mTime0 in TPC track)
683+
DECLARE_SOA_COLUMN(TPCdEdxNorm, tpcdEdxNorm, float); //! 100/TrackTPC.mdEdxAlt used to normalize dEdX...values below
683684
DECLARE_SOA_COLUMN(TPCDCAR, tpcdcaR, int16_t); //! tpc only DCAr
684685
DECLARE_SOA_COLUMN(TPCDCAZ, tpcdcaZ, int16_t); //! tpc only DCAz
685686
DECLARE_SOA_COLUMN(TPCClusterByteMask, tpcClusterByteMask, uint8_t); //! tracklet bitmask - track defining 8 tracklets (152=8*19 rows) bit set if nCluster>thr (default 5)
686-
DECLARE_SOA_COLUMN(TPCdEdxMax0R, tpcdEdxMax0R, uint8_t); //! TPC dEdxQMax -ROC0/dEdx
687+
DECLARE_SOA_COLUMN(TPCdEdxMax0R, tpcdEdxMax0R, uint8_t); //! TPC dEdxQMax -ROC0/dEdx from TrackTPC.mdEdxAlt
687688
DECLARE_SOA_COLUMN(TPCdEdxMax1R, tpcdEdxMax1R, uint8_t); //! TPC dEdxQMax -ROC1/dEdx
688689
DECLARE_SOA_COLUMN(TPCdEdxMax2R, tpcdEdxMax2R, uint8_t); //! TPC dEdxQMax -ROC2/dEdx
689690
DECLARE_SOA_COLUMN(TPCdEdxMax3R, tpcdEdxMax3R, uint8_t); //! TPC dEdxQMax -ROC3/dEdx
@@ -736,7 +737,17 @@ DECLARE_SOA_TABLE_VERSIONED(TracksQA_002, "AOD", "TRACKQA", 2, //! trackQA infor
736737
trackqa::IsDummy<trackqa::DeltaRefContParamY, trackqa::DeltaRefContParamZ, trackqa::DeltaRefContParamSnp, trackqa::DeltaRefContParamTgl, trackqa::DeltaRefContParamQ2Pt,
737738
trackqa::DeltaRefGloParamY, trackqa::DeltaRefGloParamZ, trackqa::DeltaRefGloParamSnp, trackqa::DeltaRefGloParamTgl, trackqa::DeltaRefGloParamQ2Pt>);
738739

739-
using TracksQAVersion = TracksQA_002;
740+
DECLARE_SOA_TABLE_VERSIONED(TracksQA_003, "AOD", "TRACKQA", 3, //! trackQA information - version 3 - including alternative dedx normalization
741+
o2::soa::Index<>, trackqa::TrackId, trackqa::TPCTime0, trackqa::TPCdEdxNorm, trackqa::TPCDCAR, trackqa::TPCDCAZ, trackqa::TPCClusterByteMask,
742+
trackqa::TPCdEdxMax0R, trackqa::TPCdEdxMax1R, trackqa::TPCdEdxMax2R, trackqa::TPCdEdxMax3R,
743+
trackqa::TPCdEdxTot0R, trackqa::TPCdEdxTot1R, trackqa::TPCdEdxTot2R, trackqa::TPCdEdxTot3R,
744+
trackqa::DeltaRefContParamY, trackqa::DeltaRefContParamZ, trackqa::DeltaRefContParamSnp, trackqa::DeltaRefContParamTgl, trackqa::DeltaRefContParamQ2Pt,
745+
trackqa::DeltaRefGloParamY, trackqa::DeltaRefGloParamZ, trackqa::DeltaRefGloParamSnp, trackqa::DeltaRefGloParamTgl, trackqa::DeltaRefGloParamQ2Pt,
746+
trackqa::DeltaTOFdX, trackqa::DeltaTOFdZ,
747+
trackqa::IsDummy<trackqa::DeltaRefContParamY, trackqa::DeltaRefContParamZ, trackqa::DeltaRefContParamSnp, trackqa::DeltaRefContParamTgl, trackqa::DeltaRefContParamQ2Pt,
748+
trackqa::DeltaRefGloParamY, trackqa::DeltaRefGloParamZ, trackqa::DeltaRefGloParamSnp, trackqa::DeltaRefGloParamTgl, trackqa::DeltaRefGloParamQ2Pt>);
749+
750+
using TracksQAVersion = TracksQA_003;
740751
using TracksQA = TracksQAVersion::iterator;
741752

742753
namespace fwdtrack

Framework/Core/include/Framework/DataTypes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ enum TrackFlags : uint32_t {
5050
PVContributor = 0x2, // This track has contributed to the collision vertex fit
5151
OrphanTrack = 0x4, // Track has no association with any collision vertex
5252
TrackTimeAsym = 0x8, // track with an asymmetric time range
53+
TPCdEdxAlt = 0x10, // TPCSignal and tpcNClsFindableMinusPID correspond for alternative dEdx since the nominal was 0
5354
// NOTE Highest 4 (29..32) bits reserved for PID hypothesis
5455
};
5556
enum TrackFlagsRun2Enum {

0 commit comments

Comments
 (0)