From 128c4b2bf3ab3f514cfde9cb68f8723e567c9ff7 Mon Sep 17 00:00:00 2001 From: nepeivodaRS Date: Thu, 14 Mar 2024 16:11:46 +0100 Subject: [PATCH 1/6] V0DauTuner --- .../AOTTrack/V0Cascades/perfK0sResolution.cxx | 141 ++++++++++++++++-- 1 file changed, 131 insertions(+), 10 deletions(-) diff --git a/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx b/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx index 51c4557486d..40cadd8fffa 100644 --- a/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx +++ b/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx @@ -21,14 +21,15 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/PIDResponse.h" +#include "Common/Tools/TrackTuner.h" using namespace o2; using namespace o2::track; using namespace o2::framework; using namespace o2::framework::expressions; -using PIDTracks = soa::Join; -using PIDTracksIU = soa::Join; +using PIDTracks = soa::Join; +using PIDTracksIUMC = soa::Join; using SelectedCollisions = soa::Join; struct perfK0sResolution { @@ -40,10 +41,28 @@ struct perfK0sResolution { ConfigurableAxis etaBins{"etaBins", {2, -1.f, 1.f}, "eta binning"}; ConfigurableAxis etaBinsDauthers{"etaBinsDauthers", {100, -1.f, 1.f}, "eta binning for daughters"}; ConfigurableAxis phiBins{"phiBins", {100, 0.f, 6.28f}, "phi binning"}; - + ConfigurableAxis relpTResBins{"relpTResBins", {200, 0.f, 0.5f}, "rel. pT resolution binning"}; + HistogramRegistry rK0sResolution{"K0sResolution", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry rK0sDauResolution{"K0sDauResolution", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + Service ccdb; + + // for TrackTuner only (MC smearing) + o2::parameters::GRPMagField* grpmag = nullptr; + o2::base::MatLayerCylSet* lut = nullptr; + o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; + TrackTuner trackTunerObj; + + Configurable useTrackTuner{"useTrackTuner", false, "Apply Improver/DCA corrections to MC"}; + Configurable trackTunerParams{"trackTunerParams", "debugInfo=0|updateTrackCovMat=0|updateCurvature=1|updatePulls=0|isInputFileFromCCDB=1|pathInputFile=Users/m/mfaggin/test/inputsTrackTuner/PbPb2022|nameInputFile=trackTuner_DataLHC22sPass5_McLHC22l1b2_run529397.root|usePvRefitCorrections=0|oneOverPtCurrent=1|oneOverPtUpgr=1.2", "TrackTuner parameter initialization (format: =|=)"}; + OutputObj trackTunedTracks{TH1D("trackTunedTracks", "", 4, 0.5, 4.5), OutputObjHandlingPolicy::AnalysisObject}; + Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + + int runNumber = -1; + void init(InitContext const&) { const AxisSpec mAxis{mBins, "#it{m} (GeV/#it{c}^{2})"}; @@ -51,6 +70,7 @@ struct perfK0sResolution { const AxisSpec pTResAxis{pTResBins, "#Delta#it{p}_{T} (GeV/#it{c})"}; const AxisSpec pTResRelAxis{pTResRelBins, "(#it{p}_{T}^{rec} - #it{p}_{T}^{MC})/#it{p}_{T}^{MC}"}; const AxisSpec invpTResAxis{invpTResBins, "1/#it{p}_{T}-1/#it{p}_{T}^{MC} (GeV/#it{c})^{-1}"}; + const AxisSpec relpTResAxis{relpTResBins, "#sigma(#it{p}_{T})/#it{p}_{T}"}; const AxisSpec etaAxis{etaBins, "#eta"}; const AxisSpec etaAxisPosD{etaBinsDauthers, "#eta pos."}; const AxisSpec etaAxisNegD{etaBinsDauthers, "#eta neg."}; @@ -80,6 +100,9 @@ struct perfK0sResolution { rK0sDauResolution.add("h2_genPxNegPxRes", "h2_genPxNegPxRes", {HistType::kTH2F, {pTResRelAxis, pTAxis}}); rK0sDauResolution.add("h2_genPyNegPyRes", "h2_genPyNegPyRes", {HistType::kTH2F, {pTResRelAxis, pTAxis}}); rK0sDauResolution.add("h2_genPzNegPzRes", "h2_genPzNegPzRes", {HistType::kTH2F, {pTResRelAxis, pTAxis}}); + + rK0sDauResolution.add("h2_PosRelPtRes", "h2_PosRelPtRes", {HistType::kTH2F, {pTAxis, relpTResAxis}}); + rK0sDauResolution.add("h2_NegRelPtRes", "h2_NegRelPtRes", {HistType::kTH2F, {pTAxis, relpTResAxis}}); } rK0sResolution.add("h2_masspT", "h2_masspT", {HistType::kTH2F, {mAxis, pTAxis}}); rK0sResolution.add("h2_masseta", "h2_masseta", {HistType::kTH2F, {mAxis, etaAxis}}); @@ -91,6 +114,39 @@ struct perfK0sResolution { rK0sResolution.add("thn_mass", "thn_mass", kTHnSparseF, {mAxis, pTAxis, etaAxis, phiAxis, etaAxisPosD, etaAxisNegD}); } } + + ccdb->setURL(ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + + /// TrackTuner initialization + if (useTrackTuner) { + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(lutPath)); + std::string outputStringParams = trackTunerObj.configParams(trackTunerParams); + trackTunerObj.getDcaGraphs(); + // QA is done in tuneTrackParams method + trackTunedTracks->SetTitle(outputStringParams.c_str()); + trackTunedTracks->GetXaxis()->SetBinLabel(1, "all tracks"); + trackTunedTracks->GetXaxis()->SetBinLabel(2, "tracks tuned (no negative detXY)"); + trackTunedTracks->GetXaxis()->SetBinLabel(3, "untouched tracks due to negative detXY"); + trackTunedTracks->GetXaxis()->SetBinLabel(4, "original detXY<0"); + } + } + + void initCCDB(aod::BCsWithTimestamps::iterator const& bc) + { + if (runNumber == bc.runNumber()) { + return; + } + grpmag = ccdb->getForTimeStamp(grpmagPath, bc.timestamp()); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath; + } + LOG(info) << "Setting magnetic field to current " << grpmag->getL3Current() << " A for run " << bc.runNumber() << " from its GRPMagField CCDB object"; + o2::base::Propagator::initFieldFromGRP(grpmag); + o2::base::Propagator::Instance()->setMatLUT(lut); + runNumber = bc.runNumber(); } // Selection criteria @@ -101,7 +157,7 @@ struct perfK0sResolution { Configurable v0setting_radius{"v0setting_radius", 0.9, "V0 Radius"}; Configurable v0setting_rapidity{"v0setting_rapidity", 0.5, "rapidity"}; - Configurable v0lifetime{"v0lifetime", 3., "n ctau"}; + Configurable nV0lifetime{"nV0lifetime", 3., "n ctau"}; Configurable nSigTPC{"nSigTPC", 10., "nSigTPC"}; Configurable itsIbSelectionPos{"itsIbSelectionPos", 0, "Flag for the ITS IB selection on positive daughters: -1 no ITS IB, 0 no selection, 1 ITS IB"}; Configurable itsIbSelectionNeg{"itsIbSelectionNeg", 0, "Flag for the ITS IB IB selection on negative daughters: -1 no ITS IB, 0 no selection, 1 ITS IB"}; @@ -112,6 +168,7 @@ struct perfK0sResolution { Configurable extraCutTPCClusters{"extraCutTPCClusters", -1.0f, "Extra cut on daugthers for TPC clusters"}; Configurable useMultidimHisto{"useMultidimHisto", false, "use multidimentional histograms"}; Configurable computeInvMassFromDaughters{"computeInvMassFromDaughters", false, "Compute the invariant mass from the daughters"}; + Configurable requireTrueK0s{"requireTrueK0s", false, "require rec. v0 to be true K0s"}; // Configurable for event selection Configurable cutzvertex{"cutzvertex", 10.0f, "Accepted z-vertex range (cm)"}; @@ -127,7 +184,7 @@ struct perfK0sResolution { if (v0.v0radius() < v0setting_radius) { return false; } - if (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * pid_constants::sMasses[PID::K0] > 2.684 * v0lifetime) { + if (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * pid_constants::sMasses[PID::K0] > 2.684 * nV0lifetime) { return false; } @@ -262,7 +319,7 @@ struct perfK0sResolution { void processData(soa::Filtered::iterator const& collision, soa::Filtered const& fullV0s, - PIDTracks const& tracks) + PIDTracks const&) { for (auto& v0 : fullV0s) { const auto& posTrack = v0.posTrack_as(); @@ -287,12 +344,52 @@ struct perfK0sResolution { } PROCESS_SWITCH(perfK0sResolution, processData, "Process data", true); - void processMC(soa::Filtered::iterator const& collision, soa::Filtered> const& fullV0s, - soa::Join const& tracks, aod::McParticles const&) + // Running variables + o2::dataformats::VertexBase mVtx; + o2::dataformats::DCA mDcaInfoCovPos; + o2::dataformats::DCA mDcaInfoCovNeg; + o2::track::TrackParametrizationWithError mTrackParCovPos; + o2::track::TrackParametrizationWithError mTrackParCovNeg; + + template + void tuneV0(TV0 const& v0, + aod::McParticles const&, + aod::BCsWithTimestamps const& bcs) + { + initCCDB(bcs.begin()); + trackTunedTracks->Fill(1, 2); // tune 2 tracks + + const auto& posTrack = v0.template posTrack_as(); + const auto& negTrack = v0.template negTrack_as(); + setTrackParCov(posTrack, mTrackParCovPos); + setTrackParCov(negTrack, mTrackParCovNeg); + mTrackParCovPos.setPID(posTrack.pidForTracking()); + mTrackParCovNeg.setPID(negTrack.pidForTracking()); + mDcaInfoCovPos.set(999, 999, 999, 999, 999); + mDcaInfoCovNeg.set(999, 999, 999, 999, 999); + auto mcParticlePos = posTrack.mcParticle(); + auto mcParticleNeg = negTrack.mcParticle(); + + LOG(info) << "Inside tuneTrack: before calling tuneTrackParams trackParCov.getY(): " << trackParCov.getY(); + trackTunerObj.tuneTrackParams(mcParticlePos, mTrackParCovPos, matCorr, &mDcaInfoCovPos, trackTunedTracks); + trackTunerObj.tuneTrackParams(mcParticleNeg, mTrackParCovNeg, matCorr, &mDcaInfoCovNeg, trackTunedTracks); + LOG(info) << "Inside tuneTrack: after calling tuneTrackParams trackParCov.getY(): " << trackParCov.getY(); + // trackTunedTracks->Fill(1, 2); + mVtx.setPos({v0.x(), v0.y(), v0.z()}); + mVtx.setCov(v0.positionCovMat()[0], v0.positionCovMat()[1], v0.positionCovMat()[2], v0.positionCovMat()[3], v0.positionCovMat()[4], v0.positionCovMat()[5]); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, mTrackParCovPos, 2.f, matCorr, &mDcaInfoCovPos); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, mTrackParCovNeg, 2.f, matCorr, &mDcaInfoCovNeg); + } + + void processMC(soa::Filtered::iterator const& collision, + soa::Filtered> const& fullV0s, + PIDTracksIUMC const&, + aod::McParticles const& mcParticles, + aod::BCsWithTimestamps const& bcs) { for (auto& v0 : fullV0s) { - const auto& posTrack = v0.posTrack_as>(); - const auto& negTrack = v0.negTrack_as>(); + const auto& posTrack = v0.posTrack_as(); + const auto& negTrack = v0.negTrack_as(); if (!acceptV0(v0, negTrack, posTrack, collision)) continue; if (!posTrack.has_mcParticle()) { @@ -304,13 +401,31 @@ struct perfK0sResolution { if (posTrack.mcParticle().pdgCode() != 211 || negTrack.mcParticle().pdgCode() != -211) { continue; } + if (useTrackTuner) { + tuneV0(v0, mcParticles, bcs); + } + float mass = v0.mK0Short(); + if (computeInvMassFromDaughters) { mass = RecoDecay::m(std::array{std::array{posTrack.px(), posTrack.py(), posTrack.pz()}, std::array{negTrack.px(), negTrack.py(), negTrack.pz()}}, std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged}); } + if (useTrackTuner) { + std::array pPos{0., 0., 0.}; + std::array pNeg{0., 0., 0.}; + mTrackParCovPos.getPxPyPzGlo(pPos); + mTrackParCovNeg.getPxPyPzGlo(pNeg); + mass = RecoDecay::m(std::array{std::array{pPos[0], pPos[1], pPos[2]}, + std::array{pNeg[0], pNeg[1], pNeg[2]}}, + std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged}); + } + const bool isTrueK0s = (v0.has_mcParticle() && v0.mcParticle().pdgCode() == 310); + if (!isTrueK0s && requireTrueK0s) { + continue; + } rK0sDauResolution.fill(HIST("h2_genPtPosPtRes"), (v0.positivept() - posTrack.mcParticle().pt()) / posTrack.mcParticle().pt(), posTrack.mcParticle().pt()); rK0sDauResolution.fill(HIST("h2_genPxPosPxRes"), (v0.pxpos() - posTrack.mcParticle().px()) / posTrack.mcParticle().px(), posTrack.mcParticle().px()); rK0sDauResolution.fill(HIST("h2_genPyPosPyRes"), (v0.pypos() - posTrack.mcParticle().py()) / posTrack.mcParticle().py(), posTrack.mcParticle().py()); @@ -323,9 +438,15 @@ struct perfK0sResolution { rK0sDauResolution.fill(HIST("h2_massPosPtRes"), mass, v0.positivept() - posTrack.mcParticle().pt()); rK0sDauResolution.fill(HIST("h2_massNegPtRes"), mass, v0.negativept() - negTrack.mcParticle().pt()); + + rK0sDauResolution.fill(HIST("h2_PosRelPtRes"), v0.positivept(), RecoDecay::sqrtSumOfSquares(v0.covMatPosDau()[9], v0.covMatPosDau()[14]), v0.positivept()); + rK0sDauResolution.fill(HIST("h2_NegRelPtRes"), v0.negativept(), RecoDecay::sqrtSumOfSquares(v0.covMatNegDau()[9], v0.covMatNegDau()[14]), v0.positivept()); + + // Can be taken from kTHnSparseF (useMultidimHisto configurable) rK0sResolution.fill(HIST("h2_masspT"), mass, v0.pt()); rK0sResolution.fill(HIST("h2_masseta"), mass, v0.eta()); rK0sResolution.fill(HIST("h2_massphi"), mass, v0.phi()); + if (useMultidimHisto) { rK0sResolution.fill(HIST("thn_mass"), mass, v0.pt(), v0.eta(), v0.phi(), posTrack.eta(), negTrack.eta(), 1. / v0.positivept() - 1. / posTrack.mcParticle().pt(), From 03ccc38efdf51d4fb4a3b87d9ea2bf4f549baad4 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Thu, 14 Mar 2024 15:27:08 +0000 Subject: [PATCH 2/6] Please consider the following formatting changes --- DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx b/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx index 003eee0963c..1f067eacad1 100644 --- a/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx +++ b/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx @@ -440,7 +440,7 @@ struct perfK0sResolution { o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, mTrackParCovNeg, 2.f, matCorr, &mDcaInfoCovNeg); } - void processMC(soa::Filtered::iterator const& collision, + void processMC(soa::Filtered::iterator const& collision, soa::Filtered> const& fullV0s, PIDTracksIUMC const&, aod::McParticles const& mcParticles, @@ -475,7 +475,7 @@ struct perfK0sResolution { } if (useTrackTuner) { std::array pPos{0., 0., 0.}; - std::array pNeg{0., 0., 0.}; + std::array pNeg{0., 0., 0.}; mTrackParCovPos.getPxPyPzGlo(pPos); mTrackParCovNeg.getPxPyPzGlo(pNeg); mass = RecoDecay::m(std::array{std::array{pPos[0], pPos[1], pPos[2]}, From 39590a02d34581c9057d15e34d45601038c9f74d Mon Sep 17 00:00:00 2001 From: nepeivodaRS Date: Thu, 14 Mar 2024 16:51:14 +0100 Subject: [PATCH 3/6] del LOGs --- DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx b/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx index 1f067eacad1..7868a232f70 100644 --- a/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx +++ b/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx @@ -429,10 +429,10 @@ struct perfK0sResolution { auto mcParticlePos = posTrack.mcParticle(); auto mcParticleNeg = negTrack.mcParticle(); - LOG(info) << "Inside tuneTrack: before calling tuneTrackParams trackParCov.getY(): " << mTrackParCovPos.getY(); + //LOG(info) << "Inside tuneTrack: before calling tuneTrackParams trackParCov.getY(): " << mTrackParCovPos.getY(); trackTunerObj.tuneTrackParams(mcParticlePos, mTrackParCovPos, matCorr, &mDcaInfoCovPos, trackTunedTracks); trackTunerObj.tuneTrackParams(mcParticleNeg, mTrackParCovNeg, matCorr, &mDcaInfoCovNeg, trackTunedTracks); - LOG(info) << "Inside tuneTrack: after calling tuneTrackParams trackParCov.getY(): " << mTrackParCovPos.getY(); + //LOG(info) << "Inside tuneTrack: after calling tuneTrackParams trackParCov.getY(): " << mTrackParCovPos.getY(); // trackTunedTracks->Fill(1, 2); mVtx.setPos({v0.x(), v0.y(), v0.z()}); mVtx.setCov(v0.positionCovMat()[0], v0.positionCovMat()[1], v0.positionCovMat()[2], v0.positionCovMat()[3], v0.positionCovMat()[4], v0.positionCovMat()[5]); From 381f6a10fc2e9b3321973468eb768332ee856b4d Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Thu, 14 Mar 2024 15:51:41 +0000 Subject: [PATCH 4/6] Please consider the following formatting changes --- DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx b/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx index 7868a232f70..d37a2c5e09e 100644 --- a/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx +++ b/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx @@ -429,11 +429,11 @@ struct perfK0sResolution { auto mcParticlePos = posTrack.mcParticle(); auto mcParticleNeg = negTrack.mcParticle(); - //LOG(info) << "Inside tuneTrack: before calling tuneTrackParams trackParCov.getY(): " << mTrackParCovPos.getY(); + // LOG(info) << "Inside tuneTrack: before calling tuneTrackParams trackParCov.getY(): " << mTrackParCovPos.getY(); trackTunerObj.tuneTrackParams(mcParticlePos, mTrackParCovPos, matCorr, &mDcaInfoCovPos, trackTunedTracks); trackTunerObj.tuneTrackParams(mcParticleNeg, mTrackParCovNeg, matCorr, &mDcaInfoCovNeg, trackTunedTracks); - //LOG(info) << "Inside tuneTrack: after calling tuneTrackParams trackParCov.getY(): " << mTrackParCovPos.getY(); - // trackTunedTracks->Fill(1, 2); + // LOG(info) << "Inside tuneTrack: after calling tuneTrackParams trackParCov.getY(): " << mTrackParCovPos.getY(); + // trackTunedTracks->Fill(1, 2); mVtx.setPos({v0.x(), v0.y(), v0.z()}); mVtx.setCov(v0.positionCovMat()[0], v0.positionCovMat()[1], v0.positionCovMat()[2], v0.positionCovMat()[3], v0.positionCovMat()[4], v0.positionCovMat()[5]); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, mTrackParCovPos, 2.f, matCorr, &mDcaInfoCovPos); From 1198656030a13f8b2f49a03c22c7177f929f8dbc Mon Sep 17 00:00:00 2001 From: nepeivodaRS Date: Fri, 15 Mar 2024 13:32:35 +0100 Subject: [PATCH 5/6] update pefK0sTask 1. Stat histo 2. Addressing comments of Mattia 3. V0 inv mass histo is filled for all selected candidates, 2 bools are added --- .../AOTTrack/V0Cascades/perfK0sResolution.cxx | 107 +++++++++--------- 1 file changed, 53 insertions(+), 54 deletions(-) diff --git a/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx b/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx index d37a2c5e09e..21b4b0bcbb3 100644 --- a/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx +++ b/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx @@ -96,7 +96,7 @@ struct perfK0sResolution { void init(InitContext const&) { - const AxisSpec eventAxis{10, 0, 10, "Events"}; + const AxisSpec statAxis{3, 0, 3, "Stats"}; const AxisSpec mAxis{mBins, "#it{m} (GeV/#it{c}^{2})"}; const AxisSpec pTAxis{pTBins, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec pTResAxis{pTResBins, "#Delta#it{p}_{T} (GeV/#it{c})"}; @@ -109,17 +109,12 @@ struct perfK0sResolution { const AxisSpec phiAxis{phiBins, "#phi"}; const AxisSpec trueK0Axis{2, -0.5, 1.5, "True K0"}; - int nProc = 0; - if (doprocessData) { - LOG(info) << "processData enabled"; - nProc++; - } - if (doprocessMC) { - LOG(info) << "processMC enabled"; - nProc++; + rK0sResolution.add("h1_stats", "h1_stats", {HistType::kTH1F, {statAxis}}); + TString hStatsLabels[3] = {"Selected Events", "All V0s", "Selected V0s"}; + for (Int_t n = 1; n <= rK0sResolution.get(HIST("h1_stats"))->GetNbinsX(); n++) { + rK0sResolution.get(HIST("h1_stats"))->GetXaxis()->SetBinLabel(n, hStatsLabels[n - 1]); } - rK0sResolution.add("h1_events", "h1_events", {HistType::kTH1F, {eventAxis}}); if (doprocessMC) { rK0sDauResolution.add("h2_massPosPtRes", "h2_massPosPtRes", {HistType::kTH2F, {mAxis, pTResAxis}}); rK0sDauResolution.add("h2_massNegPtRes", "h2_massNegPtRes", {HistType::kTH2F, {mAxis, pTResAxis}}); @@ -152,13 +147,12 @@ struct perfK0sResolution { rK0sDauResolution.add("h3_tpc_vs_pid_hypothesis", "h3_tpc_vs_pid_hypothesis", {HistType::kTH3F, {{200, -10.f, 10.f, "#it{p}/Z (GeV/#it{c})"}, {1000, 0, 1000.f, "dE/dx (a.u.)"}, {10, -0.5, 9.5f, "PID hypothesis"}}}); } - ccdb->setURL(ccdburl); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - ccdb->setFatalWhenNull(false); - /// TrackTuner initialization if (useTrackTuner) { + ccdb->setURL(ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(lutPath)); std::string outputStringParams = trackTunerObj.configParams(trackTunerParams); trackTunerObj.getDcaGraphs(); @@ -374,13 +368,14 @@ struct perfK0sResolution { soa::Filtered const& fullV0s, PIDTracks const&) { - rK0sResolution.fill(HIST("h1_events"), 0.5); + rK0sResolution.fill(HIST("h1_stats"), 0.5); for (auto& v0 : fullV0s) { - rK0sResolution.fill(HIST("h1_events"), 1.5); + rK0sResolution.fill(HIST("h1_stats"), 1.5); const auto& posTrack = v0.posTrack_as(); const auto& negTrack = v0.negTrack_as(); if (!acceptV0(v0, negTrack, posTrack, collision)) continue; + rK0sResolution.fill(HIST("h1_stats"), 2.5); float mass = v0.mK0Short(); if (computeInvMassFromDaughters) { @@ -410,16 +405,15 @@ struct perfK0sResolution { o2::track::TrackParametrizationWithError mTrackParCovPos; o2::track::TrackParametrizationWithError mTrackParCovNeg; - template + template void tuneV0(TV0 const& v0, + TV0Track const& posTrack, + TV0Track const& negTrack, aod::McParticles const&, aod::BCsWithTimestamps const& bcs) { initCCDB(bcs.begin()); trackTunedTracks->Fill(1, 2); // tune 2 tracks - - const auto& posTrack = v0.template posTrack_as(); - const auto& negTrack = v0.template negTrack_as(); setTrackParCov(posTrack, mTrackParCovPos); setTrackParCov(negTrack, mTrackParCovNeg); mTrackParCovPos.setPID(posTrack.pidForTracking()); @@ -440,30 +434,33 @@ struct perfK0sResolution { o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, mTrackParCovNeg, 2.f, matCorr, &mDcaInfoCovNeg); } + bool daughtersHaveMCParticles = false; + bool daughtersCorrRec = false; + void processMC(soa::Filtered::iterator const& collision, soa::Filtered> const& fullV0s, PIDTracksIUMC const&, aod::McParticles const& mcParticles, aod::BCsWithTimestamps const& bcs) { - rK0sResolution.fill(HIST("h1_events"), 0.5); + rK0sResolution.fill(HIST("h1_stats"), 0.5); for (auto& v0 : fullV0s) { - rK0sResolution.fill(HIST("h1_events"), 1.5); + rK0sResolution.fill(HIST("h1_stats"), 1.5); const auto& posTrack = v0.posTrack_as(); const auto& negTrack = v0.negTrack_as(); if (!acceptV0(v0, negTrack, posTrack, collision)) continue; - if (!posTrack.has_mcParticle()) { - continue; - } - if (!negTrack.has_mcParticle()) { - continue; - } - if (posTrack.mcParticle().pdgCode() != 211 || negTrack.mcParticle().pdgCode() != -211) { - continue; + rK0sResolution.fill(HIST("h1_stats"), 2.5); + + if (posTrack.has_mcParticle() && negTrack.has_mcParticle()) { + daughtersHaveMCParticles = true; + if (posTrack.mcParticle().pdgCode() == 211 && negTrack.mcParticle().pdgCode() == -211) { + daughtersCorrRec = true; + } } - if (useTrackTuner) { - tuneV0(v0, mcParticles, bcs); + + if (useTrackTuner && daughtersHaveMCParticles) { + tuneV0(v0, posTrack, negTrack, mcParticles, bcs); } float mass = v0.mK0Short(); @@ -473,7 +470,7 @@ struct perfK0sResolution { std::array{negTrack.px(), negTrack.py(), negTrack.pz()}}, std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged}); } - if (useTrackTuner) { + if (useTrackTuner && daughtersHaveMCParticles) { std::array pPos{0., 0., 0.}; std::array pNeg{0., 0., 0.}; mTrackParCovPos.getPxPyPzGlo(pPos); @@ -487,33 +484,35 @@ struct perfK0sResolution { if (!isTrueK0s && requireTrueK0s) { continue; } - rK0sDauResolution.fill(HIST("h2_genPtPosPtRes"), (v0.positivept() - posTrack.mcParticle().pt()) / posTrack.mcParticle().pt(), posTrack.mcParticle().pt()); - rK0sDauResolution.fill(HIST("h2_genPxPosPxRes"), (v0.pxpos() - posTrack.mcParticle().px()) / posTrack.mcParticle().px(), posTrack.mcParticle().px()); - rK0sDauResolution.fill(HIST("h2_genPyPosPyRes"), (v0.pypos() - posTrack.mcParticle().py()) / posTrack.mcParticle().py(), posTrack.mcParticle().py()); - rK0sDauResolution.fill(HIST("h2_genPzPosPzRes"), (v0.pzpos() - posTrack.mcParticle().pz()) / posTrack.mcParticle().pz(), posTrack.mcParticle().pz()); - rK0sDauResolution.fill(HIST("h2_genPtNegPtRes"), (v0.negativept() - negTrack.mcParticle().pt()) / negTrack.mcParticle().pt(), negTrack.mcParticle().pt()); - rK0sDauResolution.fill(HIST("h2_genPxNegPxRes"), (v0.pxneg() - negTrack.mcParticle().px()) / negTrack.mcParticle().px(), negTrack.mcParticle().px()); - rK0sDauResolution.fill(HIST("h2_genPyNegPyRes"), (v0.pyneg() - negTrack.mcParticle().py()) / negTrack.mcParticle().py(), negTrack.mcParticle().py()); - rK0sDauResolution.fill(HIST("h2_genPzNegPzRes"), (v0.pzneg() - negTrack.mcParticle().pz()) / negTrack.mcParticle().pz(), negTrack.mcParticle().pz()); - - rK0sDauResolution.fill(HIST("h2_massPosPtRes"), mass, v0.positivept() - posTrack.mcParticle().pt()); - rK0sDauResolution.fill(HIST("h2_massNegPtRes"), mass, v0.negativept() - negTrack.mcParticle().pt()); + // QA of correctly reconstructed V0 daughters + if (daughtersCorrRec) { + rK0sDauResolution.fill(HIST("h2_genPtPosPtRes"), (v0.positivept() - posTrack.mcParticle().pt()) / posTrack.mcParticle().pt(), posTrack.mcParticle().pt()); + rK0sDauResolution.fill(HIST("h2_genPxPosPxRes"), (v0.pxpos() - posTrack.mcParticle().px()) / posTrack.mcParticle().px(), posTrack.mcParticle().px()); + rK0sDauResolution.fill(HIST("h2_genPyPosPyRes"), (v0.pypos() - posTrack.mcParticle().py()) / posTrack.mcParticle().py(), posTrack.mcParticle().py()); + rK0sDauResolution.fill(HIST("h2_genPzPosPzRes"), (v0.pzpos() - posTrack.mcParticle().pz()) / posTrack.mcParticle().pz(), posTrack.mcParticle().pz()); + + rK0sDauResolution.fill(HIST("h2_genPtNegPtRes"), (v0.negativept() - negTrack.mcParticle().pt()) / negTrack.mcParticle().pt(), negTrack.mcParticle().pt()); + rK0sDauResolution.fill(HIST("h2_genPxNegPxRes"), (v0.pxneg() - negTrack.mcParticle().px()) / negTrack.mcParticle().px(), negTrack.mcParticle().px()); + rK0sDauResolution.fill(HIST("h2_genPyNegPyRes"), (v0.pyneg() - negTrack.mcParticle().py()) / negTrack.mcParticle().py(), negTrack.mcParticle().py()); + rK0sDauResolution.fill(HIST("h2_genPzNegPzRes"), (v0.pzneg() - negTrack.mcParticle().pz()) / negTrack.mcParticle().pz(), negTrack.mcParticle().pz()); + + rK0sDauResolution.fill(HIST("h2_massPosPtRes"), mass, v0.positivept() - posTrack.mcParticle().pt()); + rK0sDauResolution.fill(HIST("h2_massNegPtRes"), mass, v0.negativept() - negTrack.mcParticle().pt()); + if (useMultidimHisto) { + rK0sResolution.fill(HIST("thn_mass"), mass, v0.pt(), v0.eta(), v0.phi(), posTrack.eta(), negTrack.eta(), + 1. / v0.positivept() - 1. / posTrack.mcParticle().pt(), + 1. / v0.negativept() - 1. / negTrack.mcParticle().pt(), + isTrueK0s); + } + } + // QA of seleted V0s rK0sDauResolution.fill(HIST("h2_PosRelPtRes"), v0.positivept(), RecoDecay::sqrtSumOfSquares(v0.covMatPosDau()[9], v0.covMatPosDau()[14]), v0.positivept()); rK0sDauResolution.fill(HIST("h2_NegRelPtRes"), v0.negativept(), RecoDecay::sqrtSumOfSquares(v0.covMatNegDau()[9], v0.covMatNegDau()[14]), v0.positivept()); - - // Can be taken from kTHnSparseF (useMultidimHisto configurable) rK0sResolution.fill(HIST("h2_masspT"), mass, v0.pt()); rK0sResolution.fill(HIST("h2_masseta"), mass, v0.eta()); rK0sResolution.fill(HIST("h2_massphi"), mass, v0.phi()); - - if (useMultidimHisto) { - rK0sResolution.fill(HIST("thn_mass"), mass, v0.pt(), v0.eta(), v0.phi(), posTrack.eta(), negTrack.eta(), - 1. / v0.positivept() - 1. / posTrack.mcParticle().pt(), - 1. / v0.negativept() - 1. / negTrack.mcParticle().pt(), - isTrueK0s); - } } } PROCESS_SWITCH(perfK0sResolution, processMC, "Process MC", false); From 367b9c78c13b82c6d728611ac004c1183ea5caa7 Mon Sep 17 00:00:00 2001 From: nepeivodaRS Date: Fri, 15 Mar 2024 13:46:45 +0100 Subject: [PATCH 6/6] add stat histo bins --- DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx b/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx index 21b4b0bcbb3..71fb9a22eb4 100644 --- a/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx +++ b/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx @@ -96,7 +96,7 @@ struct perfK0sResolution { void init(InitContext const&) { - const AxisSpec statAxis{3, 0, 3, "Stats"}; + const AxisSpec statAxis{5, 0, 5, "Stats"}; const AxisSpec mAxis{mBins, "#it{m} (GeV/#it{c}^{2})"}; const AxisSpec pTAxis{pTBins, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec pTResAxis{pTResBins, "#Delta#it{p}_{T} (GeV/#it{c})"}; @@ -110,7 +110,7 @@ struct perfK0sResolution { const AxisSpec trueK0Axis{2, -0.5, 1.5, "True K0"}; rK0sResolution.add("h1_stats", "h1_stats", {HistType::kTH1F, {statAxis}}); - TString hStatsLabels[3] = {"Selected Events", "All V0s", "Selected V0s"}; + TString hStatsLabels[5] = {"Selected Events", "All V0s", "Selected V0s", "Daughters have MC particles", "Daughters corr. rec."}; for (Int_t n = 1; n <= rK0sResolution.get(HIST("h1_stats"))->GetNbinsX(); n++) { rK0sResolution.get(HIST("h1_stats"))->GetXaxis()->SetBinLabel(n, hStatsLabels[n - 1]); } @@ -454,8 +454,10 @@ struct perfK0sResolution { if (posTrack.has_mcParticle() && negTrack.has_mcParticle()) { daughtersHaveMCParticles = true; + rK0sResolution.fill(HIST("h1_stats"), 3.5); if (posTrack.mcParticle().pdgCode() == 211 && negTrack.mcParticle().pdgCode() == -211) { daughtersCorrRec = true; + rK0sResolution.fill(HIST("h1_stats"), 4.5); } }