@@ -539,6 +539,10 @@ int32_t GPUQA::InitQACreateHistograms()
539539 }
540540 std::unique_ptr<double []> binsPt{CreateLogAxis (AXIS_BINS [4 ], PT_MIN_CLUST , PT_MAX )};
541541 createHist (mTrackPt , " tracks_pt" , " tracks_pt" , AXIS_BINS [4 ], binsPt.get ());
542+ for (int32_t i = 0 ; i < 2 ; i++) {
543+ snprintf (name, 2048 , i ? " tracks_dedx_max" : " tracks_dedx_tot" );
544+ createHist (mTrackdEdx [i], name, name, 200 , -3 , 1 , 1000 , 0 , i ? 1500 : 5000 );
545+ }
542546 const uint32_t maxTime = (mTracking && mTracking ->GetParam ().continuousMaxTimeBin > 0 ) ? mTracking ->GetParam ().continuousMaxTimeBin : constants::TPC_MAX_TIME_BIN_TRIGGERED ;
543547 createHist (mT0 [0 ], " tracks_t0" , " tracks_t0" , (maxTime + 1 ) / 10 , 0 , maxTime);
544548 createHist (mT0 [1 ], " tracks_t0_res" , " tracks_t0_res" , 1000 , -100 , 100 );
@@ -1745,6 +1749,12 @@ void GPUQA::RunQA(bool matchOnly, const std::vector<o2::tpc::TrackTPC>* tracksEx
17451749 continue ;
17461750 }
17471751 mTrackPt ->Fill (1 .f / fabsf (track.GetParam ().GetQPt ()));
1752+ if (mParam ->par .dodEdx && mParam ->dodEdxEnabled && track.NClusters () >= 60 ) {
1753+ const GPUdEdxInfo& trackdEdx = mTracking ->GetProcessors ()->tpcMerger .MergedTracksdEdx ()[i];
1754+ const float logp = logf (1 .f / fabsf (track.GetParam ().GetQPt ()) * sqrtf (1 .f + track.GetParam ().GetDzDs () * track.GetParam ().GetDzDs ()));
1755+ mTrackdEdx [0 ]->Fill (logp, trackdEdx.dEdxTotTPC );
1756+ mTrackdEdx [1 ]->Fill (logp, trackdEdx.dEdxMaxTPC );
1757+ }
17481758 mNCl [0 ]->Fill (track.NClustersFitted ());
17491759 uint32_t nClCorrected = 0 ;
17501760 const auto & trackClusters = mTracking ->mIOPtrs .mergedTrackHits ;
@@ -2255,12 +2265,15 @@ int32_t GPUQA::DrawQAHistograms(TObjArray* qcout)
22552265
22562266 // Create Canvas for track statistic histos
22572267 if (mQATasks & taskTrackStatistics) {
2258- mCTrackPt = createGarbageCollected<TCanvas>(" ctrackspt" , " ctrackspt" , 0 , 0 , 700 , 700 . * 2 . / 3 .);
2259- mCTrackPt ->cd ();
2260- mPTrackPt = createGarbageCollected<TPad>(" p0" , " " , 0.0 , 0.0 , 1.0 , 1.0 );
2261- mPTrackPt ->Draw ();
2262- mLTrackPt = createGarbageCollected<TLegend>(0.9 - legendSpacingString * 1.5 , 0.93 - (0.93 - 0.86 ) / 2 . * (float )ConfigNumInputs, 0.98 , 0.949 );
2263- SetLegend (mLTrackPt , true );
2268+ for (int32_t i = 0 ; i < 3 ; i++) {
2269+ snprintf (name, 2048 , " ctracks%s" , i ? (i == 2 ? " dedxmax" : " dedxtot" ) : " pt" );
2270+ mCTracks [i] = createGarbageCollected<TCanvas>(name, name, 0 , 0 , 700 , 700 . * 2 . / 3 .);
2271+ mCTracks [i]->cd ();
2272+ mPTracks [i] = createGarbageCollected<TPad>(" p0" , " " , 0.0 , 0.0 , 1.0 , 1.0 );
2273+ mPTracks [i]->Draw ();
2274+ mLTracks [i] = createGarbageCollected<TLegend>(0.9 - legendSpacingString * 1.5 , 0.93 - (0.93 - 0.86 ) / 2 . * (float )ConfigNumInputs, 0.98 , 0.949 );
2275+ SetLegend (mLTracks [i], true );
2276+ }
22642277
22652278 for (int32_t i = 0 ; i < 2 ; i++) {
22662279 snprintf (name, 2048 , " ctrackst0%d" , i);
@@ -2916,6 +2929,7 @@ int32_t GPUQA::DrawQAHistograms(TObjArray* qcout)
29162929
29172930 if (mQATasks & taskTrackStatistics) {
29182931 // Process track statistic histograms
2932+
29192933 float tmpMax = 0 .;
29202934 for (int32_t k = 0 ; k < ConfigNumInputs; k++) { // TODO: Simplify this drawing, avoid copy&paste
29212935 TH1F * e = mTrackPt ;
@@ -2927,8 +2941,8 @@ int32_t GPUQA::DrawQAHistograms(TObjArray* qcout)
29272941 tmpMax = e->GetMaximum ();
29282942 }
29292943 }
2930- mPTrackPt ->cd ();
2931- mPTrackPt ->SetLogx ();
2944+ mPTracks [ 0 ] ->cd ();
2945+ mPTracks [ 0 ] ->SetLogx ();
29322946 for (int32_t k = 0 ; k < ConfigNumInputs; k++) {
29332947 TH1F * e = mTrackPt ;
29342948 if (GetHist (e, tin, k, nNewInput) == nullptr ) {
@@ -2952,17 +2966,40 @@ int32_t GPUQA::DrawQAHistograms(TObjArray* qcout)
29522966 e->SetLineColor (colorNums[k % COLORCOUNT ]);
29532967 e->Draw (k == 0 ? " " : " same" );
29542968 GetName (fname, k, mConfig .inputHistogramsOnly );
2955- mLTrackPt ->AddEntry (e, Form (mConfig .inputHistogramsOnly ? " %s" : " %sTrack #it{p}_{T}" , fname), " l" );
2969+ mLTracks [ 0 ] ->AddEntry (e, Form (mConfig .inputHistogramsOnly ? " %s" : " %sTrack #it{p}_{T}" , fname), " l" );
29562970 }
2957- mLTrackPt ->Draw ();
2971+ mLTracks [ 0 ] ->Draw ();
29582972 doPerfFigure (0.63 , 0.7 , 0.030 );
2959- mCTrackPt ->cd ();
2960- mCTrackPt ->Print (Form (" %s/tracks.pdf" , mConfig .plotsDir .c_str ()));
2973+ mCTracks [ 0 ] ->cd ();
2974+ mCTracks [ 0 ] ->Print (Form (" %s/tracks%s .pdf" , mConfig .plotsDir .c_str (), " pt " ));
29612975 if (mConfig .writeFileExt != " " ) {
2962- mCTrackPt ->Print (Form (" %s/tracks.%s" , mConfig .plotsDir .c_str (), mConfig .writeFileExt .c_str ()));
2976+ mCTracks [ 0 ] ->Print (Form (" %s/tracks%s .%s" , mConfig .plotsDir .c_str (), " pt " , mConfig .writeFileExt .c_str ()));
29632977 }
29642978
29652979 for (int32_t i = 0 ; i < 2 ; i++) {
2980+ mPTracks [1 + i]->cd ();
2981+ {
2982+ TH2F * e = mTrackdEdx [i];
2983+ if (tout && !mConfig .inputHistogramsOnly ) {
2984+ e->Write ();
2985+ }
2986+ // e->SetStats(kFALSE);
2987+ e->SetTitle (mConfig .plotsNoTitle ? " " : (i ? " Track dE/dx (Max)" : " Track dE/dx (Tot)" ));
2988+ e->GetYaxis ()->SetTitle (i ? " dE/dx (max)" : " dE/dx (tot)" );
2989+ e->GetXaxis ()->SetTitle (" log(#it{p})" );
2990+ e->GetXaxis ()->SetTitleOffset (1.2 );
2991+ if (qcout) {
2992+ qcout->Add (e);
2993+ }
2994+ e->SetOption (" colz" );
2995+ e->Draw ();
2996+ }
2997+ mCTracks [1 + i]->cd ();
2998+ mCTracks [1 + i]->Print (Form (" %s/tracks%s.pdf" , mConfig .plotsDir .c_str (), i ? " dedx_max" : " dedx_tot" ));
2999+ if (mConfig .writeFileExt != " " ) {
3000+ mCTracks [1 + i]->Print (Form (" %s/tracks%s.%s" , mConfig .plotsDir .c_str (), i ? " dedx_max" : " dedx_tot" , mConfig .writeFileExt .c_str ()));
3001+ }
3002+
29663003 tmpMax = 0 .;
29673004 for (int32_t k = 0 ; k < ConfigNumInputs; k++) {
29683005 TH1F * e = mT0 [i];
0 commit comments