@@ -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
0 commit comments