Skip to content

Commit a550f1f

Browse files
[PWGLF] nucleiQC and nucleiUtils (#14263)
1 parent 02318e1 commit a550f1f

File tree

3 files changed

+144
-53
lines changed

3 files changed

+144
-53
lines changed

PWGLF/DataModel/LFSlimNucleiTables.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ DECLARE_SOA_TABLE(NucleiTableRed, "AOD", "NUCLEITABLERED",
198198
NucleiTableNS::DCAxy,
199199
NucleiTableNS::DCAz,
200200
NucleiTableNS::Flags,
201+
NucleiTableNS::gPt,
201202
NucleiTableNS::McProcess,
202203
NucleiTableNS::PDGcode,
203204
NucleiTableNS::MotherPDGcode);

PWGLF/TableProducer/QC/nucleiQC.cxx

Lines changed: 85 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)