@@ -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 ) {
@@ -1732,6 +1734,11 @@ void GPUQA::RunQA(bool matchOnly, const std::vector<o2::tpc::TrackTPC>* tracksEx
17321734 }
17331735 }
17341736 mNCl [1 ]->Fill (nClCorrected);
1737+ mT0 [0 ]->Fill (track.GetParam ().GetTZOffset ());
1738+ if (mTrackMCLabels .size () && !mTrackMCLabels [i].isFake () && !track.MergedLooper () && !track.CCE ()) {
1739+ const auto & info = GetMCTrack (mTrackMCLabels [i]);
1740+ mT0 [1 ]->Fill (track.GetParam ().GetTZOffset () - info.t0 );
1741+ }
17351742 }
17361743 if (mClNative && mTracking && mTracking ->GetTPCTransformHelper ()) {
17371744 for (uint32_t i = 0 ; i < GPUChainTracking::NSECTORS; i++) {
@@ -2130,15 +2137,23 @@ int32_t GPUQA::DrawQAHistograms(TObjArray* qcout)
21302137
21312138 // Create Canvas for track statistic histos
21322139 if (mQATasks & taskTrackStatistics) {
2133- mCTracks = createGarbageCollected<TCanvas>(" ctracks " , " Track Pt" , 0 , 0 , 700 , 700 . * 2 . / 3 .);
2140+ mCTracks = createGarbageCollected<TCanvas>(" ctrackspt " , " Track Pt" , 0 , 0 , 700 , 700 . * 2 . / 3 .);
21342141 mCTracks ->cd ();
21352142 mPTracks = createGarbageCollected<TPad>(" p0" , " " , 0.0 , 0.0 , 1.0 , 1.0 );
21362143 mPTracks ->Draw ();
21372144 mLTracks = createGarbageCollected<TLegend>(0.9 - legendSpacingString * 1.45 , 0.93 - (0.93 - 0.86 ) / 2 . * (float )ConfigNumInputs, 0.98 , 0.949 );
21382145 SetLegend (mLTracks );
21392146
21402147 for (int32_t i = 0 ; i < 2 ; i++) {
2141- snprintf (name, 2048 , " cncl%d Pull" , i);
2148+ snprintf (name, 2048 , " ctrackst0%d" , i);
2149+ mCT0 [i] = createGarbageCollected<TCanvas>(name, " Track T0" , 0 , 0 , 700 , 700 . * 2 . / 3 .);
2150+ mCT0 [i]->cd ();
2151+ mPT0 [i] = createGarbageCollected<TPad>(" p0" , " " , 0.0 , 0.0 , 1.0 , 1.0 );
2152+ mPT0 [i]->Draw ();
2153+ mLT0 [i] = createGarbageCollected<TLegend>(0.9 - legendSpacingString * 1.45 , 0.93 - (0.93 - 0.86 ) / 2 . * (float )ConfigNumInputs, 0.98 , 0.949 );
2154+ SetLegend (mLT0 [i]);
2155+
2156+ snprintf (name, 2048 , " cncl%d" , i);
21422157 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 .);
21432158 mCNCl [i]->cd ();
21442159 mPNCl [i] = createGarbageCollected<TPad>(" p0" , " " , 0.0 , 0.0 , 1.0 , 1.0 );
@@ -2742,7 +2757,7 @@ int32_t GPUQA::DrawQAHistograms(TObjArray* qcout)
27422757 if (mQATasks & taskTrackStatistics) {
27432758 // Process track statistic histograms
27442759 float tmpMax = 0 .;
2745- for (int32_t k = 0 ; k < ConfigNumInputs; k++) {
2760+ for (int32_t k = 0 ; k < ConfigNumInputs; k++) { // TODO: Simplify this drawing, avoid copy&paste
27462761 TH1F* e = mTracks ;
27472762 if (GetHist (e, tin, k, nNewInput) == nullptr ) {
27482763 continue ;
@@ -2786,6 +2801,51 @@ int32_t GPUQA::DrawQAHistograms(TObjArray* qcout)
27862801 }
27872802
27882803 for (int32_t i = 0 ; i < 2 ; i++) {
2804+ tmpMax = 0 .;
2805+ for (int32_t k = 0 ; k < ConfigNumInputs; k++) {
2806+ TH1F* e = mT0 [i];
2807+ if (GetHist (e, tin, k, nNewInput) == nullptr ) {
2808+ continue ;
2809+ }
2810+ e->SetMaximum (-1111 );
2811+ if (e->GetMaximum () > tmpMax) {
2812+ tmpMax = e->GetMaximum ();
2813+ }
2814+ }
2815+ mPT0 [i]->cd ();
2816+ for (int32_t k = 0 ; k < ConfigNumInputs; k++) {
2817+ TH1F* e = mT0 [i];
2818+ if (GetHist (e, tin, k, nNewInput) == nullptr ) {
2819+ continue ;
2820+ }
2821+ if (tout && !mConfig .inputHistogramsOnly && k == 0 ) {
2822+ e->Write ();
2823+ }
2824+ e->SetMaximum (tmpMax * 1.02 );
2825+ e->SetMinimum (tmpMax * -0.02 );
2826+ e->SetStats (kFALSE );
2827+ e->SetLineWidth (1 );
2828+ e->GetYaxis ()->SetTitle (" a.u." );
2829+ e->GetXaxis ()->SetTitle (i ? " to vs t0_{mc}" : " t0" );
2830+ if (qcout) {
2831+ qcout->Add (e);
2832+ }
2833+ e->SetMarkerColor (kBlack );
2834+ e->SetLineColor (colorNums[k % COLORCOUNT]);
2835+ e->Draw (k == 0 ? " " : " same" );
2836+ GetName (fname, k);
2837+ snprintf (name, 2048 , " %sTrack T0 %s" , fname, i ? " " : " resolution" );
2838+ mLT0 [i]->AddEntry (e, name, " l" );
2839+ }
2840+ mLT0 [i]->Draw ();
2841+ mCT0 [i]->cd ();
2842+ snprintf (name, 2048 , " plots/t0%s.pdf" , i ? " _res" : " " );
2843+ mCT0 [i]->Print (name);
2844+ if (mConfig .writeRootFiles ) {
2845+ snprintf (name, 2048 , " plots/t0%s.root" , i ? " _res" : " " );
2846+ mCT0 [i]->Print (name);
2847+ }
2848+
27892849 tmpMax = 0 .;
27902850 for (int32_t k = 0 ; k < ConfigNumInputs; k++) {
27912851 TH1F* e = mNCl [i];
0 commit comments