@@ -531,10 +531,12 @@ int32_t GPUQA::InitQACreateHistograms()
531531 snprintf (name, 2048 , i ? " nrows_with_cluster" : " nclusters" );
532532 createHist (mNCl [i], name, name, 160 , 0 , 159 );
533533 }
534- snprintf (name, 2048 , " tracks" );
535534 std::unique_ptr<double []> binsPt{CreateLogAxis (AXIS_BINS[4 ], PT_MIN_CLUST, PT_MAX)};
536- createHist (mTracks , name, name, AXIS_BINS[4 ], binsPt.get ());
537- createHist (mClXY , " clXY" , " clXY" , 1000 , -250 , 250 , 1000 , -250 , 250 );
535+ createHist (mTracks , " tracks_pt" , " tracks_pt" , AXIS_BINS[4 ], binsPt.get ());
536+ const uint32_t maxTime = (mTracking && mTracking ->GetParam ().continuousMaxTimeBin > 0 ) ? mTracking ->GetParam ().continuousMaxTimeBin : TPC_MAX_TIME_BIN_TRIGGERED;
537+ createHist (mT0 [0 ], " tracks_t0" , " tracks_t0" , (maxTime + 1 ) / 10 , 0 , maxTime);
538+ createHist (mT0 [1 ], " tracks_t0_res" , " tracks_t0_res" , 1000 , -100 , 100 );
539+ createHist (mClXY , " clXY" , " clXY" , 1000 , -250 , 250 , 1000 , -250 , 250 ); // TODO: Pass name only once
538540 }
539541
540542 if ((mQATasks & taskClusterCounts) && mConfig .clusterRejectionHistograms ) {
@@ -1711,6 +1713,11 @@ void GPUQA::RunQA(bool matchOnly, const std::vector<o2::tpc::TrackTPC>* tracksEx
17111713 }
17121714 }
17131715 mNCl [1 ]->Fill (nClCorrected);
1716+ mT0 [0 ]->Fill (track.GetParam ().GetTZOffset ());
1717+ if (mTrackMCLabels .size () && !mTrackMCLabels [i].isFake () && !track.MergedLooper () && !track.CCE ()) {
1718+ const auto & info = GetMCTrack (mTrackMCLabels [i]);
1719+ mT0 [1 ]->Fill (track.GetParam ().GetTZOffset () - info.t0 );
1720+ }
17141721 }
17151722 if (mClNative && mTracking && mTracking ->GetTPCTransformHelper ()) {
17161723 for (uint32_t i = 0 ; i < GPUChainTracking::NSECTORS; i++) {
@@ -2109,15 +2116,23 @@ int32_t GPUQA::DrawQAHistograms(TObjArray* qcout)
21092116
21102117 // Create Canvas for track statistic histos
21112118 if (mQATasks & taskTrackStatistics) {
2112- mCTracks = createGarbageCollected<TCanvas>(" ctracks " , " Track Pt" , 0 , 0 , 700 , 700 . * 2 . / 3 .);
2119+ mCTracks = createGarbageCollected<TCanvas>(" ctrackspt " , " Track Pt" , 0 , 0 , 700 , 700 . * 2 . / 3 .);
21132120 mCTracks ->cd ();
21142121 mPTracks = createGarbageCollected<TPad>(" p0" , " " , 0.0 , 0.0 , 1.0 , 1.0 );
21152122 mPTracks ->Draw ();
21162123 mLTracks = createGarbageCollected<TLegend>(0.9 - legendSpacingString * 1.45 , 0.93 - (0.93 - 0.86 ) / 2 . * (float )ConfigNumInputs, 0.98 , 0.949 );
21172124 SetLegend (mLTracks );
21182125
21192126 for (int32_t i = 0 ; i < 2 ; i++) {
2120- snprintf (name, 2048 , " cncl%d Pull" , i);
2127+ snprintf (name, 2048 , " ctrackst0%d" , i);
2128+ mCT0 [i] = createGarbageCollected<TCanvas>(name, " Track T0" , 0 , 0 , 700 , 700 . * 2 . / 3 .);
2129+ mCT0 [i]->cd ();
2130+ mPT0 [i] = createGarbageCollected<TPad>(" p0" , " " , 0.0 , 0.0 , 1.0 , 1.0 );
2131+ mPT0 [i]->Draw ();
2132+ mLT0 [i] = createGarbageCollected<TLegend>(0.9 - legendSpacingString * 1.45 , 0.93 - (0.93 - 0.86 ) / 2 . * (float )ConfigNumInputs, 0.98 , 0.949 );
2133+ SetLegend (mLT0 [i]);
2134+
2135+ snprintf (name, 2048 , " cncl%d" , i);
21212136 mCNCl [i] = createGarbageCollected<TCanvas>(name, i ? " Number of clusters (corrected for multiple per row)" : " Number of clusters per track" , 0 , 0 , 700 , 700 . * 2 . / 3 .);
21222137 mCNCl [i]->cd ();
21232138 mPNCl [i] = createGarbageCollected<TPad>(" p0" , " " , 0.0 , 0.0 , 1.0 , 1.0 );
@@ -2721,7 +2736,7 @@ int32_t GPUQA::DrawQAHistograms(TObjArray* qcout)
27212736 if (mQATasks & taskTrackStatistics) {
27222737 // Process track statistic histograms
27232738 float tmpMax = 0 .;
2724- for (int32_t k = 0 ; k < ConfigNumInputs; k++) {
2739+ for (int32_t k = 0 ; k < ConfigNumInputs; k++) { // TODO: Simplify this drawing, avoid copy&paste
27252740 TH1F* e = mTracks ;
27262741 if (GetHist (e, tin, k, nNewInput) == nullptr ) {
27272742 continue ;
@@ -2765,6 +2780,51 @@ int32_t GPUQA::DrawQAHistograms(TObjArray* qcout)
27652780 }
27662781
27672782 for (int32_t i = 0 ; i < 2 ; i++) {
2783+ tmpMax = 0 .;
2784+ for (int32_t k = 0 ; k < ConfigNumInputs; k++) {
2785+ TH1F* e = mT0 [i];
2786+ if (GetHist (e, tin, k, nNewInput) == nullptr ) {
2787+ continue ;
2788+ }
2789+ e->SetMaximum (-1111 );
2790+ if (e->GetMaximum () > tmpMax) {
2791+ tmpMax = e->GetMaximum ();
2792+ }
2793+ }
2794+ mPT0 [i]->cd ();
2795+ for (int32_t k = 0 ; k < ConfigNumInputs; k++) {
2796+ TH1F* e = mT0 [i];
2797+ if (GetHist (e, tin, k, nNewInput) == nullptr ) {
2798+ continue ;
2799+ }
2800+ if (tout && !mConfig .inputHistogramsOnly && k == 0 ) {
2801+ e->Write ();
2802+ }
2803+ e->SetMaximum (tmpMax * 1.02 );
2804+ e->SetMinimum (tmpMax * -0.02 );
2805+ e->SetStats (kFALSE );
2806+ e->SetLineWidth (1 );
2807+ e->GetYaxis ()->SetTitle (" a.u." );
2808+ e->GetXaxis ()->SetTitle (i ? " to vs t0_{mc}" : " t0" );
2809+ if (qcout) {
2810+ qcout->Add (e);
2811+ }
2812+ e->SetMarkerColor (kBlack );
2813+ e->SetLineColor (colorNums[k % COLORCOUNT]);
2814+ e->Draw (k == 0 ? " " : " same" );
2815+ GetName (fname, k);
2816+ snprintf (name, 2048 , " %sTrack T0 %s" , fname, i ? " " : " resolution" );
2817+ mLT0 [i]->AddEntry (e, name, " l" );
2818+ }
2819+ mLT0 [i]->Draw ();
2820+ mCT0 [i]->cd ();
2821+ snprintf (name, 2048 , " plots/t0%s.pdf" , i ? " _res" : " " );
2822+ mCT0 [i]->Print (name);
2823+ if (mConfig .writeRootFiles ) {
2824+ snprintf (name, 2048 , " plots/t0%s.root" , i ? " _res" : " " );
2825+ mCT0 [i]->Print (name);
2826+ }
2827+
27682828 tmpMax = 0 .;
27692829 for (int32_t k = 0 ; k < ConfigNumInputs; k++) {
27702830 TH1F* e = mNCl [i];
0 commit comments