diff --git a/PWGHF/Tasks/HFMCValidation.cxx b/PWGHF/Tasks/HFMCValidation.cxx index 4faaa9c13b2..59fa5e755e5 100644 --- a/PWGHF/Tasks/HFMCValidation.cxx +++ b/PWGHF/Tasks/HFMCValidation.cxx @@ -273,20 +273,20 @@ struct ValidationRecLevel { std::array, nCharmHadrons> histDeltaPt, histDeltaPx, histDeltaPy, histDeltaPz, histDeltaSecondaryVertexX, histDeltaSecondaryVertexY, histDeltaSecondaryVertexZ, histDeltaDecayLength; std::array, 3>, 2>, nCharmHadrons> histPtDau, histEtaDau, histImpactParameterDau; std::array, 2>, nCharmHadrons> histPtReco; - std::array, 4> histOriginTracks; + std::array, 4> histOriginTracks; HistogramRegistry registry{"registry", {}}; void init(o2::framework::InitContext&) { - histOriginTracks[0] = registry.add("histOriginNonAssociatedTracks", ";origin;#it{p}_{T}^{reco} (GeV/#it{c})", HistType::kTH2F, {{4, -1.5, 2.5}, {50, 0., 10.}}); // tracks not associated to any collision - histOriginTracks[1] = registry.add("histOriginAssociatedTracks", ";origin;#it{p}_{T}^{reco} (GeV/#it{c})", HistType::kTH2F, {{4, -1.5, 2.5}, {50, 0., 10.}}); // tracks associasted to a collision - histOriginTracks[2] = registry.add("histOriginGoodAssociatedTracks", ";origin;#it{p}_{T}^{reco} (GeV/#it{c})", HistType::kTH2F, {{4, -1.5, 2.5}, {50, 0., 10.}}); // tracks associated to the correct collision (considering the MC collision index) - histOriginTracks[3] = registry.add("histOriginWrongAssociatedTracks", ";origin;#it{p}_{T}^{reco} (GeV/#it{c})", HistType::kTH2F, {{4, -1.5, 2.5}, {50, 0., 10.}}); // tracks associated to the wrong collision (considering the MC collision index) + histOriginTracks[0] = registry.add("histOriginNonAssociatedTracks", ";origin;#it{p}_{T}^{reco} (GeV/#it{c});#it{#eta}^{reco};#it{Z}_{vtx}^{reco}#minus#it{Z}_{vtx}^{gen} (cm)", HistType::kTHnSparseF, {{4, -1.5, 2.5}, {50, 0., 10.}, {40, -1., 1.}, {200, -1., 1.}}); // tracks not associated to any collision + histOriginTracks[1] = registry.add("histOriginAssociatedTracks", ";origin;#it{p}_{T}^{reco} (GeV/#it{c});#it{#eta}^{reco};#it{Z}_{vtx}^{reco}#minus#it{Z}_{vtx}^{gen} (cm)", HistType::kTHnSparseF, {{4, -1.5, 2.5}, {50, 0., 10.}, {40, -1., 1.}, {200, -1., 1.}}); // tracks associasted to a collision + histOriginTracks[2] = registry.add("histOriginGoodAssociatedTracks", ";origin;#it{p}_{T}^{reco} (GeV/#it{c});#it{#eta}^{reco};#it{Z}_{vtx}^{reco}#minus#it{Z}_{vtx}^{gen} (cm)", HistType::kTHnSparseF, {{4, -1.5, 2.5}, {50, 0., 10.}, {40, -1., 1.}, {200, -1., 1.}}); // tracks associated to the correct collision (considering the MC collision index) + histOriginTracks[3] = registry.add("histOriginWrongAssociatedTracks", ";origin;#it{p}_{T}^{reco} (GeV/#it{c});#it{#eta}^{reco};#it{Z}_{vtx}^{reco}#minus#it{Z}_{vtx}^{gen} (cm)", HistType::kTHnSparseF, {{4, -1.5, 2.5}, {50, 0., 10.}, {40, -1., 1.}, {200, -1., 1.}}); // tracks associated to the wrong collision (considering the MC collision index) for (std::size_t iHist{0}; iHist < histOriginTracks.size(); ++iHist) { - histOriginTracks[iHist]->GetXaxis()->SetBinLabel(1, "no MC particle"); - histOriginTracks[iHist]->GetXaxis()->SetBinLabel(2, "no quark"); - histOriginTracks[iHist]->GetXaxis()->SetBinLabel(3, "charm"); - histOriginTracks[iHist]->GetXaxis()->SetBinLabel(4, "beauty"); + histOriginTracks[iHist]->GetAxis(0)->SetBinLabel(1, "no MC particle"); + histOriginTracks[iHist]->GetAxis(0)->SetBinLabel(2, "no quark"); + histOriginTracks[iHist]->GetAxis(0)->SetBinLabel(3, "charm"); + histOriginTracks[iHist]->GetAxis(0)->SetBinLabel(4, "beauty"); } for (auto iHad = 0; iHad < nCharmHadrons; ++iHad) { histDeltaPt[iHad] = registry.add(Form("histDeltaPt%s", particleNames[iHad].data()), Form("Pt difference reco - MC %s; #it{p}_{T}^{reco} - #it{p}_{T}^{gen} (GeV/#it{c}); entries", labels[iHad].data()), HistType::kTH1F, {{2000, -1., 1.}}); @@ -311,27 +311,33 @@ struct ValidationRecLevel { using HfCandProng2WithMCRec = soa::Join; using HfCandProng3WithMCRec = soa::Join; using CollisionsWithMCLabels = soa::Join; + using TracksWithSel = soa::Join; - void process(HfCandProng2WithMCRec const& cand2Prongs, HfCandProng3WithMCRec const& cand3Prongs, aod::BigTracksMC const& tracks, aod::McParticles const& particlesMC, aod::McCollisions const& mcCollisions, CollisionsWithMCLabels const& collisions) + void process(HfCandProng2WithMCRec const& cand2Prongs, HfCandProng3WithMCRec const& cand3Prongs, TracksWithSel const& tracks, aod::McParticles const& particlesMC, aod::McCollisions const& mcCollisions, CollisionsWithMCLabels const& collisions) { // loop over tracks for (auto& track : tracks) { + if (track.isGlobalTrackWoDCA() != (uint8_t) true) { + continue; + } uint index = uint(track.collisionId() >= 0); if (track.has_mcParticle()) { auto particle = track.mcParticle(); // get corresponding MC particle to check origin auto origin = RecoDecay::getCharmHadronOrigin(particlesMC, particle, true); - histOriginTracks[index]->Fill(origin, track.pt()); + float deltaZ = -999.f; if (index) { auto collision = track.collision_as(); auto mcCollision = particle.mcCollision(); + deltaZ = collision.posZ() - mcCollision.posZ(); uint index2 = 2; - if ((collision.mcCollisionId() == particle.mcCollisionId()) && std::abs(collision.posZ() - mcCollision.posZ()) < 0.02) { // 200 microns compatibility of Z vertex position also required + if (collision.mcCollisionId() == particle.mcCollisionId()) { index2 = 1; } - histOriginTracks[index + index2]->Fill(origin, track.pt()); + histOriginTracks[index + index2]->Fill(origin, track.pt(), track.eta(), deltaZ); } + histOriginTracks[index]->Fill(origin, track.pt(), track.eta(), deltaZ); } else { - histOriginTracks[index]->Fill(-1., track.pt()); + histOriginTracks[index]->Fill(-1.f, track.pt(), track.eta(), -999.f); } } @@ -359,8 +365,8 @@ struct ValidationRecLevel { if (whichHad >= 0 && whichOrigin >= 0) { int indexParticle = 0; - if (cand2Prong.index0_as().has_mcParticle()) { - indexParticle = RecoDecay::getMother(particlesMC, cand2Prong.index0_as().mcParticle(), PDGArrayParticle[whichHad], true); + if (cand2Prong.index0_as().has_mcParticle()) { + indexParticle = RecoDecay::getMother(particlesMC, cand2Prong.index0_as().mcParticle(), PDGArrayParticle[whichHad], true); } auto mother = particlesMC.rawIteratorAt(indexParticle); histDeltaPt[whichHad]->Fill(cand2Prong.pt() - mother.pt()); @@ -424,8 +430,8 @@ struct ValidationRecLevel { if (whichHad >= 0) { int indexParticle = 0; - if (cand3Prong.index0_as().has_mcParticle()) { - indexParticle = RecoDecay::getMother(particlesMC, cand3Prong.index0_as().mcParticle(), PDGArrayParticle[whichHad], true); + if (cand3Prong.index0_as().has_mcParticle()) { + indexParticle = RecoDecay::getMother(particlesMC, cand3Prong.index0_as().mcParticle(), PDGArrayParticle[whichHad], true); } auto mother = particlesMC.rawIteratorAt(indexParticle); histDeltaPt[whichHad]->Fill(cand3Prong.pt() - mother.pt());