@@ -80,6 +80,11 @@ struct nucleiQC {
8080 Configurable<LabeledArray<double >> cfgBetheBlochParams{" cfgBetheBlochParams" , {nuclei::betheBlochDefault[0 ], nuclei::Species::kNspecies , 6 , nuclei::names, nuclei::betheBlochParNames}, " TPC Bethe-Bloch parameterisation for light nuclei" };
8181 Configurable<LabeledArray<int >> cfgUseCentralTpcCalibration{" cfgUseCentralTpcCalibration" , {nuclei::useCentralTpcCalibrationDefault[0 ], nuclei::Species::kNspecies , 1 , nuclei::names, {" UseCentralTpcCalibration" }}, " Use central TPC calibration" };
8282
83+ Configurable<LabeledArray<int >> cfgUseTrackTuner{" cfgUseTrackTuner" , {nuclei::useTrackTuner[0 ], nuclei::Species::kNspecies , 1 , nuclei::names, {" UseTrckTuner" }}, " Use Track Tuner" };
84+ Configurable<std::string> cfgTrackTunerParams{" cfgTrackTunerParams" , " debugInfo=0|updateTrackDCAs=1|updateTrackCovMat=1|updateCurvature=0|updateCurvatureIU=0|updatePulls=0|isInputFileFromCCDB=1|pathInputFile=Users/m/mfaggin/test/inputsTrackTuner/pp2023/pass4/correct_names|nameInputFile=trackTuner_DataLHC23hPass4_McLHC23k4g.root|pathFileQoverPt=Users/h/hsharma/qOverPtGraphs|nameFileQoverPt=D0sigma_Data_removal_itstps_MC_LHC22b1b.root|usePvRefitCorrections=0|qOverPtMC=-1.|qOverPtData=-1.|nPhiBins=1|autoDetectDcaCalib=false" , " TrackTuner parameter initialization (format: <name>=<value>|<name>=<value>)" };
85+ Configurable<int > cfgTrackTunerConfigSource{" cfgTrackTunerConfigSource" , aod::track_tuner::InputString, " 1: input string; 2: TrackTuner Configurables" };
86+ ConfigurableAxis cfgAxisPtQA{" axisPtQA" , {VARIABLE_WIDTH, 0 .0f , 0 .1f , 0 .2f , 0 .3f , 0 .4f , 0 .5f , 0 .6f , 0 .7f , 0 .8f , 0 .9f , 1 .0f , 1 .1f , 1 .2f , 1 .3f , 1 .4f , 1 .5f , 1 .6f , 1 .7f , 1 .8f , 1 .9f , 2 .0f , 2 .2f , 2 .4f , 2 .6f , 2 .8f , 3 .0f , 3 .2f , 3 .4f , 3 .6f , 3 .8f , 4 .0f , 4 .4f , 4 .8f , 5 .2f , 5 .6f , 6 .0f , 6 .5f , 7 .0f , 7 .5f , 8 .0f , 9 .0f , 10 .0f , 11 .0f , 12 .0f , 13 .0f , 14 .0f , 15 .0f , 17 .0f , 19 .0f , 21 .0f , 23 .0f , 25 .0f , 30 .0f , 35 .0f , 40 .0f , 50 .0f }, " pt axis for QA histograms" };
87+
8388 Configurable<float > cfgRapidityMin{" cfgRapidityMin" , -1 ., " Minimum rapidity value" };
8489 Configurable<float > cfgRapidityMax{" cfgRapidityMax" , 1 ., " Maximum rapidity value" };
8590 Configurable<float > cfgRapidityCenterMass{" cfgRapidityCenterMass" , 0 .0f , " Center of mass rapidity" };
@@ -106,17 +111,26 @@ struct nucleiQC {
106111 {" hEventSelections" , " Event selections; Selection step; Counts" , {HistType::kTH1D , {{nuclei::evSel::kNevSels + 1 , -0 .5f , static_cast <float >(nuclei::evSel::kNevSels ) + 0 .5f }}}},
107112 {" hVtxZBefore" , " Vertex distribution in Z before selections;Z (cm)" , {HistType::kTH1F , {{400 , -20.0 , 20.0 }}}},
108113 {" hVtxZ" , " Vertex distribution in Z;Z (cm)" , {HistType::kTH1F , {{400 , -20.0 , 20.0 }}}},
114+ {" hFailCentrality" , " 0: all the times the centrality filling function is called - 1: each time it fails ; Bool" , {HistType::kTH1F , {{2 , -0.5 , 1.50 }}}},
115+ {" hTrackTunedTracks" , " " , {HistType::kTH1F , {{1 , 0.5 , 1.5 }}}},
109116 },
110117 OutputObjHandlingPolicy::AnalysisObject,
111118 false ,
112119 true };
120+ std::shared_ptr<TH1> mHistFailCentrality = mHistograms .get<TH1>(HIST(" hFailCentrality" ));
121+ std::shared_ptr<TH1> mHistTrackTunedTracks = mHistograms .get<TH1>(HIST(" hTrackTunedTracks" ));
122+
113123 std::vector<int > mSpeciesToProcess ;
114124 Produces<aod::NucleiTableRed> mNucleiTableRed ;
115125
116126 std::vector<nuclei::SlimCandidate> mNucleiCandidates ;
117127 std::vector<int > mFilledMcParticleIds ;
118128
129+ TrackTuner mTrackTuner ;
130+ o2::base::Propagator::MatCorrType mMatCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT;
131+ std::array<float , 2 > mDcaInfo ;
119132 o2::dataformats::DCA mDcaInfoCov ;
133+ o2::dataformats::VertexBase mVtx ;
120134 o2::track::TrackParametrizationWithError<float > mTrackParCov ;
121135 std::array<nuclei::PidManager, static_cast <int >(nuclei::Species::kNspecies )> mPidManagers ;
122136
@@ -158,6 +172,33 @@ struct nucleiQC {
158172 mPidManagers [kSpeciesRt ] = nuclei::PidManager (kSpeciesRt );
159173 }
160174 });
175+
176+ // / TrackTuner initialization
177+ bool anyTrackTuner = false ;
178+ for (int iSpecies = 0 ; iSpecies < static_cast <int >(nuclei::Species::kNspecies ); iSpecies++) {
179+ anyTrackTuner = anyTrackTuner || cfgUseTrackTuner->get (iSpecies);
180+ }
181+
182+ if (anyTrackTuner) {
183+ std::string outputStringParams = " " ;
184+ switch (cfgTrackTunerConfigSource) {
185+ case aod::track_tuner::InputString:
186+ outputStringParams = mTrackTuner .configParams (cfgTrackTunerParams);
187+ break ;
188+ case aod::track_tuner::Configurables:
189+ outputStringParams = mTrackTuner .configParams ();
190+ break ;
191+
192+ default :
193+ LOG (fatal) << " TrackTuner configuration source not defined. Fix it! (Supported options: input string (1); Configurables (2))" ;
194+ break ;
195+ }
196+
197+ if (!mTrackTuner .autoDetectDcaCalib ) {
198+ mTrackTuner .getDcaGraphs ();
199+ mHistTrackTunedTracks ->SetTitle (outputStringParams.c_str ());
200+ }
201+ }
161202 }
162203
163204 void initCCDB (const aod::BCsWithTimestamps::iterator& bc)
@@ -294,23 +335,35 @@ struct nucleiQC {
294335 {
295336 candidate.ptGenerated = particle.pt () * (particle.pdgCode () > 0 ? 1 .f : -1 .f );
296337 candidate.etaGenerated = particle.eta ();
338+ candidate.yGenerated = particle.y ();
297339 candidate.phiGenerated = particle.phi ();
298340 }
299341
300- template <typename Tcollision, typename Ttrack>
301- void fillDcaInformation (const Tcollision& collision, const Ttrack& track, nuclei::SlimCandidate& candidate)
342+ template <const bool isMc, typename Tcollision, typename Ttrack>
343+ void fillDcaInformation (const int iSpecies, const Tcollision& collision, const Ttrack& track, nuclei::SlimCandidate& candidate, const aod::McParticles::iterator& particle )
302344 {
303345
304346 const o2::math_utils::Point3D<float > collisionVertex{collision.posX (), collision.posY (), collision.posZ ()};
305347
306348 mDcaInfoCov .set (999 , 999 , 999 , 999 , 999 );
307349 setTrackParCov (track, mTrackParCov );
308350 mTrackParCov .setPID (track.pidForTracking ());
309- std::array<float , 2 > dcaInfo;
310- o2::base::Propagator::Instance ()->propagateToDCA (collisionVertex, mTrackParCov , mBz , 2 .f , static_cast <o2::base::Propagator::MatCorrType>(cfgMaterialCorrection.value ), &dcaInfo);
311351
312- candidate.DCAxy = dcaInfo[0 ];
313- candidate.DCAz = dcaInfo[1 ];
352+ if constexpr (isMc) {
353+ if (track.has_mcParticle () && cfgUseTrackTuner->get (iSpecies)) {
354+ mHistTrackTunedTracks ->Fill (1 .);
355+ mTrackTuner .tuneTrackParams (particle, mTrackParCov , mMatCorr , &mDcaInfoCov , mHistTrackTunedTracks );
356+ }
357+ } else {
358+ mMatCorr = static_cast <o2::base::Propagator::MatCorrType>(cfgMaterialCorrection.value );
359+ }
360+
361+ mVtx .setPos ({collision.posX (), collision.posY (), collision.posZ ()});
362+ mVtx .setCov (collision.covXX (), collision.covXY (), collision.covYY (), collision.covXZ (), collision.covYZ (), collision.covZZ ());
363+ o2::base::Propagator::Instance ()->propagateToDCABxByBz (mVtx , mTrackParCov , 2 .f , mMatCorr , &mDcaInfoCov );
364+
365+ candidate.DCAxy = mDcaInfoCov .getY ();
366+ candidate.DCAz = mDcaInfoCov .getZ ();
314367 }
315368
316369 template <const bool isMc, typename Tcollision, typename Ttrack>
@@ -333,22 +386,26 @@ struct nucleiQC {
333386 .motherPdgCode = 0 ,
334387 .ptGenerated = 0 .f , // to be filled for mc
335388 .etaGenerated = 0 .f ,
389+ .yGenerated = 0 .f ,
336390 .phiGenerated = 0 .f ,
337- .centrality = nuclei::getCentrality (collision, cfgCentralityEstimator),
391+ .centrality = nuclei::getCentrality (collision, cfgCentralityEstimator, mHistFailCentrality ),
338392 .mcProcess = TMCProcess::kPNoProcess };
339393
340- fillDcaInformation (collision, track, candidate);
341394 fillNucleusFlagsPdgs (iSpecies, collision, track, candidate);
342395
396+ aod::McParticles::iterator particle;
397+
343398 if constexpr (isMc) {
344399 if (track.has_mcParticle ()) {
345400
346- const auto & particle = track.mcParticle ();
401+ particle = track.mcParticle ();
347402 fillNucleusFlagsPdgsMc (particle, candidate);
348403 fillNucleusGeneratedVariables (particle, candidate);
349404 }
350405 }
351406
407+ fillDcaInformation<isMc>(iSpecies, collision, track, candidate, particle);
408+
352409 return candidate;
353410 }
354411
@@ -381,11 +438,12 @@ struct nucleiQC {
381438 if (isGenerated) {
382439 const float ptGenerated = (kIndex == nuclei::Species::kPr || kIndex == nuclei::Species::kDe || kIndex == nuclei::Species::kTr ) ? candidate.ptGenerated : candidate.ptGenerated / 2 .f ;
383440 mHistograms .fill (HIST (nuclei::cNames[kIndex ]) + HIST (" /hPtGenerated" ), ptGenerated);
384- mHistograms .fill (HIST (nuclei::cNames[kIndex ]) + HIST (" /h3PtVsEtaVsCentralityGenerated" ), ptGenerated, candidate.etaGenerated , candidate.centrality );
441+ mHistograms .fill (HIST (nuclei::cNames[kIndex ]) + HIST (" /h2PtVsCentralityGenerated" ), ptGenerated, candidate.centrality );
442+ mHistograms .fill (HIST (nuclei::cNames[kIndex ]) + HIST (" /h3PtVsRapidityVsCentralityGenerated" ), ptGenerated, candidate.yGenerated , candidate.centrality );
385443 mHistograms .fill (HIST (nuclei::cNames[kIndex ]) + HIST (" /h3PhiVsEtaVsCentralityGenerated" ), candidate.phiGenerated , candidate.etaGenerated , candidate.centrality );
386444 } else {
387445 mHistograms .fill (HIST (nuclei::cNames[kIndex ]) + HIST (" /hPtReconstructed" ), candidate.pt );
388- mHistograms .fill (HIST (nuclei::cNames[kIndex ]) + HIST (" /h3PtVsEtaVsCentralityReconstructed " ), candidate.pt , candidate. eta , candidate.centrality );
446+ mHistograms .fill (HIST (nuclei::cNames[kIndex ]) + HIST (" /h2PtVsCentralityReconstructed " ), candidate.pt , candidate.centrality );
389447 mHistograms .fill (HIST (nuclei::cNames[kIndex ]) + HIST (" /h3PhiVsEtaVsCentralityReconstructed" ), candidate.phi , candidate.eta , candidate.centrality );
390448 mHistograms .fill (HIST (nuclei::cNames[kIndex ]) + HIST (" /h3DCAxyVsPtVsCentrality" ), candidate.pt , candidate.DCAxy , candidate.centrality );
391449 mHistograms .fill (HIST (nuclei::cNames[kIndex ]) + HIST (" /h3DCAzVsPtVsCentrality" ), candidate.pt , candidate.DCAz , candidate.centrality );
@@ -406,6 +464,20 @@ struct nucleiQC {
406464 if (!nuclei::eventSelection (collision, mHistograms , cfgEventSelections, cfgCutVertex))
407465 return ;
408466
467+ bool anyTrackTuner = false ;
468+ for (int iSpecies = 0 ; iSpecies < static_cast <int >(nuclei::Species::kNspecies ); iSpecies++) {
469+ anyTrackTuner = anyTrackTuner || cfgUseTrackTuner->get (iSpecies);
470+ }
471+ if (anyTrackTuner && mTrackTuner .autoDetectDcaCalib && !mTrackTuner .areGraphsConfigured ) {
472+
473+ mTrackTuner .setRunNumber (mRunNumber );
474+
475+ // / setup the "auto-detected" path based on the run number
476+ mTrackTuner .getPathInputFileAutomaticFromCCDB ();
477+ mHistTrackTunedTracks ->SetTitle (mTrackTuner .outputString .c_str ());
478+ mTrackTuner .getDcaGraphs ();
479+ }
480+
409481 for (const auto & track : tracks) {
410482
411483 static_for<0 , nuclei::kNspecies - 1 >([&](auto iSpecies) {
@@ -469,6 +541,7 @@ struct nucleiQC {
469541 continue ;
470542
471543 nuclei::SlimCandidate candidate;
544+ candidate.centrality = nuclei::getCentrality (collision, cfgCentralityEstimator, mHistFailCentrality );
472545 fillNucleusFlagsPdgsMc (particle, candidate);
473546 fillNucleusGeneratedVariables (particle, candidate);
474547
@@ -492,6 +565,7 @@ struct nucleiQC {
492565 candidate.DCAxy ,
493566 candidate.DCAz ,
494567 candidate.flags ,
568+ candidate.ptGenerated ,
495569 candidate.mcProcess ,
496570 candidate.pdgCode ,
497571 candidate.motherPdgCode );
0 commit comments