@@ -525,6 +525,10 @@ int32_t GPUQA::InitQACreateHistograms()
525525 createHist (mClusters [i], name, name, AXIS_BINS [4 ], binsPt.get ());
526526 }
527527
528+ const int32_t maxPads = GPUTPCGeometry::NPads (GPUTPCGeometry::NROWS - 1 );
529+ createHist (mLowestRowDifferenceVsPad , " lowest_row_difference_vs_pad" , " Lowest cluster row difference;Pad of lowest reconstructed cluster;Lowest reconstructed row - lowest MC row" , maxPads, -0.5 , maxPads - 0.5 , 2 * GPUTPCGeometry::NROWS - 1 , -GPUTPCGeometry::NROWS + 0.5 , GPUTPCGeometry::NROWS - 0.5 );
530+ createHist (mLowestRowTrackMultiplicity , " lowest_row_track_multiplicity" , " Track multiplicity for missing inner clusters;Reconstructed tracks with the same MC label;Selected reconstructed tracks" , 100 , -0.5 , 99.5 );
531+
528532 createHist (mPadRow [0 ], " padrow0" , " padrow0" , GPUTPCGeometry::NROWS - PADROW_CHECK_MINCLS , 0 , GPUTPCGeometry::NROWS - 1 - PADROW_CHECK_MINCLS , GPUTPCGeometry::NROWS - PADROW_CHECK_MINCLS , 0 , GPUTPCGeometry::NROWS - 1 - PADROW_CHECK_MINCLS );
529533 createHist (mPadRow [1 ], " padrow1" , " padrow1" , 100 .f , -0 .2f , 0 .2f , GPUTPCGeometry::NROWS - PADROW_CHECK_MINCLS , 0 , GPUTPCGeometry::NROWS - 1 - PADROW_CHECK_MINCLS );
530534 createHist (mPadRow [2 ], " padrow2" , " padrow2" , 100 .f , -0 .2f , 0 .2f , GPUTPCGeometry::NROWS - PADROW_CHECK_MINCLS , 0 , GPUTPCGeometry::NROWS - 1 - PADROW_CHECK_MINCLS );
@@ -1109,7 +1113,11 @@ void GPUQA::RunQA(bool matchOnly, const std::vector<o2::tpc::TrackTPC>* tracksEx
11091113 for (uint32_t iCl = 0 ; iCl < clNative->nClusters [iSector][iRow]; iCl++) {
11101114 int32_t i = clNative->clusterOffset [iSector][iRow] + iCl;
11111115 for (int32_t j = 0 ; j < GetMCLabelNID (i); j++) {
1112- uint32_t trackId = GetMCTrackObj (mTrackMCLabelsReverse , GetMCLabel (i, j));
1116+ const mcLabelI_t label = GetMCLabel (i, j);
1117+ if (!label.isValid () || label.isNoise ()) {
1118+ continue ;
1119+ }
1120+ uint32_t trackId = GetMCTrackObj (mTrackMCLabelsReverse , label);
11131121 if (trackId < lowestPadRow.size () && lowestPadRow[trackId] > iRow) {
11141122 lowestPadRow[trackId] = iRow;
11151123 }
@@ -1119,6 +1127,28 @@ void GPUQA::RunQA(bool matchOnly, const std::vector<o2::tpc::TrackTPC>* tracksEx
11191127 }
11201128 for (uint32_t i = 0 ; i < mTracking ->mIOPtrs .nMergedTracks ; i++) {
11211129 const auto & trk = mTracking ->mIOPtrs .mergedTracks [i];
1130+ const auto & label = mTrackMCLabels [i];
1131+ if (trk.OK () && trk.NClustersFitted () > 50 && CAMath::Abs (trk.GetParam ().GetQPt ()) < 1 .f && label.isValid () && !label.isNoise () &&
1132+ (mMCTrackMin == -1 || label.getTrackID () >= mMCTrackMin ) && (mMCTrackMax == -1 || label.getTrackID () < mMCTrackMax )) {
1133+ const uint32_t trackId = GetMCTrackObj (mTrackMCLabelsReverse , label);
1134+ if (trackId < lowestPadRow.size () && lowestPadRow[trackId] < 10 ) {
1135+ const GPUTPCGMMergedTrackHit* lowestCl = nullptr ;
1136+ for (uint32_t j = 0 ; j < trk.NClusters (); j++) {
1137+ const auto & cl = mTracking ->mIOPtrs .mergedTrackHits [trk.FirstClusterRef () + j];
1138+ if (!(cl.state & GPUTPCGMMergedTrackHit::flagReject) && (!lowestCl || cl.row < lowestCl->row )) {
1139+ lowestCl = &cl;
1140+ }
1141+ }
1142+ if (lowestCl) {
1143+ const float pad = clNative->clustersLinear [lowestCl->num ].getPad ();
1144+ const int32_t difference = (int32_t )lowestCl->row - lowestPadRow[trackId];
1145+ mLowestRowDifferenceVsPad ->Fill (pad, difference);
1146+ if (CAMath::Abs (difference) > 5 && pad > 5 .f && pad < GPUTPCGeometry::NPads (lowestCl->row ) - 5 .f ) {
1147+ mLowestRowTrackMultiplicity ->Fill (GetMCTrackObj (mRecTracks , label));
1148+ }
1149+ }
1150+ }
1151+ }
11221152 if (trk.OK () && lowestPadRow[i] != 255 && trk.NClustersFitted () >= PADROW_CHECK_MINCLS && CAMath::Abs (trk.GetParam ().GetQPt ()) < 1.0 ) {
11231153 const auto & lowestCl = mTracking ->mIOPtrs .mergedTrackHits [trk.FirstClusterRef ()].row < mTracking ->mIOPtrs .mergedTrackHits [trk.FirstClusterRef () + trk.NClusters () - 1 ].row ? mTracking ->mIOPtrs .mergedTrackHits [trk.FirstClusterRef ()] : mTracking ->mIOPtrs .mergedTrackHits [trk.FirstClusterRef () + trk.NClusters () - 1 ];
11241154 const int32_t lowestRow = lowestCl.row ;
@@ -2912,6 +2942,17 @@ int32_t GPUQA::DrawQAHistograms(TObjArray* qcout)
29122942 }
29132943 }
29142944
2945+ if (mQATasks & taskClusterAttach) {
2946+ for (TH1 * h : {static_cast <TH1 *>(mLowestRowDifferenceVsPad ), static_cast <TH1 *>(mLowestRowTrackMultiplicity )}) {
2947+ if (tout && !mConfig .inputHistogramsOnly ) {
2948+ h->Write ();
2949+ }
2950+ if (qcout) {
2951+ qcout->Add (h);
2952+ }
2953+ }
2954+ }
2955+
29152956 // Process cluster count statistics
29162957 if ((mQATasks & taskClusterCounts) && !mHaveExternalHists && !mConfig .clusterRejectionHistograms && !mConfig .inputHistogramsOnly ) {
29172958 DoClusterCounts (attachClusterCounts);
0 commit comments