Skip to content

Commit a3917a6

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 38a9d91 commit a3917a6

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
@@ -416,6 +416,7 @@ class AODProducerWorkflowDPL : public Task
416416
struct TrackQA {
417417
GID trackID;
418418
float tpcTime0{};
419+
float tpcdEdxNorm{};
419420
int16_t tpcdcaR{};
420421
int16_t tpcdcaZ{};
421422
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,
@@ -2558,14 +2559,18 @@ AODProducerWorkflowDPL::TrackExtraInfo AODProducerWorkflowDPL::processBarrelTrac
25582559
if (contributorsGID[GIndex::Source::TPC].isIndexSet()) {
25592560
const auto& tpcOrig = data.getTPCTrack(contributorsGID[GIndex::TPC]);
25602561
const auto& tpcClData = mTPCCounters[contributorsGID[GIndex::TPC]];
2562+
const auto& dEdx = tpcOrig.getdEdx().dEdxTotTPC > 0 ? tpcOrig.getdEdx() : tpcOrig.getdEdxAlt();
2563+
if (tpcOrig.getdEdx().dEdxTotTPC == 0) {
2564+
extraInfoHolder.flags |= o2::aod::track::TPCdEdxAlt;
2565+
}
25612566
extraInfoHolder.tpcInnerParam = tpcOrig.getP() / tpcOrig.getAbsCharge();
25622567
extraInfoHolder.tpcChi2NCl = tpcOrig.getNClusters() ? tpcOrig.getChi2() / tpcOrig.getNClusters() : 0;
2563-
extraInfoHolder.tpcSignal = tpcOrig.getdEdx().dEdxTotTPC;
2568+
extraInfoHolder.tpcSignal = dEdx.dEdxTotTPC;
25642569
extraInfoHolder.tpcNClsFindable = tpcOrig.getNClusters();
25652570
extraInfoHolder.tpcNClsFindableMinusFound = tpcOrig.getNClusters() - tpcClData.found;
25662571
extraInfoHolder.tpcNClsFindableMinusCrossedRows = tpcOrig.getNClusters() - tpcClData.crossed;
25672572
extraInfoHolder.tpcNClsShared = tpcClData.shared;
2568-
uint32_t clsUsedForPID = tpcOrig.getdEdx().NHitsIROC + tpcOrig.getdEdx().NHitsOROC1 + tpcOrig.getdEdx().NHitsOROC2 + tpcOrig.getdEdx().NHitsOROC3;
2573+
uint32_t clsUsedForPID = dEdx.NHitsIROC + dEdx.NHitsOROC1 + dEdx.NHitsOROC2 + dEdx.NHitsOROC3;
25692574
extraInfoHolder.tpcNClsFindableMinusPID = tpcOrig.getNClusters() - clsUsedForPID;
25702575
if (src == GIndex::TPC) { // standalone TPC track should set its time from their timebins range
25712576
if (needBCSlice) {
@@ -2621,6 +2626,11 @@ AODProducerWorkflowDPL::TrackQA AODProducerWorkflowDPL::processBarrelTrackQA(int
26212626
using ValType = decltype(value);
26222627
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()))));
26232628
};
2629+
auto safeUInt8Clamp = [](auto value) -> uint8_t {
2630+
using ValType = decltype(value);
2631+
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()))));
2632+
};
2633+
26242634
/// get tracklet byteMask
26252635
uint8_t clusterCounters[8] = {0};
26262636
{
@@ -2641,16 +2651,18 @@ AODProducerWorkflowDPL::TrackQA AODProducerWorkflowDPL::processBarrelTrackQA(int
26412651
}
26422652
trackQAHolder.tpcTime0 = tpcOrig.getTime0();
26432653
trackQAHolder.tpcClusterByteMask = byteMask;
2644-
const float dEdxNorm = (tpcOrig.getdEdx().dEdxTotTPC > 0) ? 100. / tpcOrig.getdEdx().dEdxTotTPC : 0;
2645-
trackQAHolder.tpcdEdxMax0R = uint8_t(tpcOrig.getdEdx().dEdxMaxIROC * dEdxNorm);
2646-
trackQAHolder.tpcdEdxMax1R = uint8_t(tpcOrig.getdEdx().dEdxMaxOROC1 * dEdxNorm);
2647-
trackQAHolder.tpcdEdxMax2R = uint8_t(tpcOrig.getdEdx().dEdxMaxOROC2 * dEdxNorm);
2648-
trackQAHolder.tpcdEdxMax3R = uint8_t(tpcOrig.getdEdx().dEdxMaxOROC3 * dEdxNorm);
2654+
const auto& dEdxInfoAlt = tpcOrig.getdEdxAlt(); // tpcOrig.getdEdx()
2655+
const float dEdxNorm = (dEdxInfoAlt.dEdxTotTPC > 0) ? 100. / dEdxInfoAlt.dEdxTotTPC : 0;
2656+
trackQAHolder.tpcdEdxNorm = dEdxInfoAlt.dEdxTotTPC;
2657+
trackQAHolder.tpcdEdxMax0R = safeUInt8Clamp(dEdxInfoAlt.dEdxMaxIROC * dEdxNorm);
2658+
trackQAHolder.tpcdEdxMax1R = safeUInt8Clamp(dEdxInfoAlt.dEdxMaxOROC1 * dEdxNorm);
2659+
trackQAHolder.tpcdEdxMax2R = safeUInt8Clamp(dEdxInfoAlt.dEdxMaxOROC2 * dEdxNorm);
2660+
trackQAHolder.tpcdEdxMax3R = safeUInt8Clamp(dEdxInfoAlt.dEdxMaxOROC3 * dEdxNorm);
26492661
//
2650-
trackQAHolder.tpcdEdxTot0R = uint8_t(tpcOrig.getdEdx().dEdxTotIROC * dEdxNorm);
2651-
trackQAHolder.tpcdEdxTot1R = uint8_t(tpcOrig.getdEdx().dEdxTotOROC1 * dEdxNorm);
2652-
trackQAHolder.tpcdEdxTot2R = uint8_t(tpcOrig.getdEdx().dEdxTotOROC2 * dEdxNorm);
2653-
trackQAHolder.tpcdEdxTot3R = uint8_t(tpcOrig.getdEdx().dEdxTotOROC3 * dEdxNorm);
2662+
trackQAHolder.tpcdEdxTot0R = safeUInt8Clamp(dEdxInfoAlt.dEdxTotIROC * dEdxNorm);
2663+
trackQAHolder.tpcdEdxTot1R = safeUInt8Clamp(dEdxInfoAlt.dEdxTotOROC1 * dEdxNorm);
2664+
trackQAHolder.tpcdEdxTot2R = safeUInt8Clamp(dEdxInfoAlt.dEdxTotOROC2 * dEdxNorm);
2665+
trackQAHolder.tpcdEdxTot3R = safeUInt8Clamp(dEdxInfoAlt.dEdxTotOROC3 * dEdxNorm);
26542666
///
26552667
float scaleTOF{0};
26562668
auto contributorsGIDA = data.getSingleDetectorRefs(trackIndex);
@@ -2721,6 +2733,7 @@ AODProducerWorkflowDPL::TrackQA AODProducerWorkflowDPL::processBarrelTrackQA(int
27212733
<< "scaleGlo3=" << scaleGlo(3)
27222734
<< "scaleGlo4=" << scaleGlo(4)
27232735
<< "trackQAHolder.tpcTime0=" << trackQAHolder.tpcTime0
2736+
<< "trackQAHolder.tpcdEdxNorm=" << trackQAHolder.tpcdEdxNorm
27242737
<< "trackQAHolder.tpcdcaR=" << trackQAHolder.tpcdcaR
27252738
<< "trackQAHolder.tpcdcaZ=" << trackQAHolder.tpcdcaZ
27262739
<< "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)