diff --git a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx index 785227be049..6054db3d7f2 100644 --- a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx +++ b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx @@ -285,7 +285,8 @@ enum class ReAssocMCTrackStatus { }; enum class HistStatusReAssocVtx { - kTrkIdGt0 = 0, + kTrkRec = 0, + kTrkIdGt0, kTrkNonAmb, kTrkNonAmbGood, kTrkNonAmbBad, @@ -327,8 +328,8 @@ struct DndetaMFTPbPb { SliceCache cache; std::array, 4> hCollAssoc; - std::array, 27> hReAssocVtxRes; - std::array, 27> hReAssocDCA; + std::array, 28> hReAssocVtxRes; + std::array, 28> hReAssocDCA; // std::array, 23> hReAssocDCAPrim; std::array, 21> hTimeAssocWithReassocMC; @@ -418,6 +419,7 @@ struct DndetaMFTPbPb { Configurable maxDCAxy{"maxDCAxy", 0.01f, "Cut on dca XY"}; Configurable useDCAzCut{"useDCAzCut", false, "use dca Z cut"}; Configurable maxDCAz{"maxDCAz", 0.01f, "Cut on dca Z"}; + Configurable selMcMask{"selMcMask", 0, "McMask for correct match"}; } trackCuts; struct : ConfigurableGroup { @@ -555,13 +557,6 @@ struct DndetaMFTPbPb { "processMCwBestTracksCent[ESTIMATOR] should " "be enabled!"); } - if (static_cast(doprocessReAssoc2dMC) + - static_cast(doprocessReAssoc3dMC) > - 1) { - LOGP(fatal, - "Either processReAssoc2dMC OR processReAssoc3dMC " - "should be enabled!"); - } // registry.add("Events/hRCTSel", "Event accepted if RCT not selected;RCT Status;", {HistType::kTH1F, {{2, 0.5, 2.5}}}); // auto hrctSel = registry.get(HIST("Events/hRCTSel")); @@ -1188,7 +1183,7 @@ struct DndetaMFTPbPb { registry.add("TrackToColl/histAmbTrackZvtxRMS", "RMS of #it{Z}^{reco} of collisions associated to a track; RMS(#it{Z}^{reco}) (cm); entries", {HistType::kTH1F, {{100, 0., 10.}}}); } - if (doprocessReAssoc2dMC || doprocessReAssoc3dMC) { + if (doprocessReAssoc3dMC) { registry.add("ReAssocMC/hNReAssocRecoColls", "Number of times generated collisions are reconstructed; N; Counts", HistType::kTH1F, {{10, -0.5, 9.5}}); @@ -1251,6 +1246,7 @@ struct DndetaMFTPbPb { } // Vertex resolution + hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kTrkRec)] = registry.add("ReAssocMC/hVtxResRec", ";#it{p}_{T}^{reco} (GeV/#it{c});#it{#eta}^{reco};#it{X}_{vtx}^{reco}#minus#it{X}_{vtx}^{gen} (cm);#it{Y}_{vtx}^{reco}#minus#it{Y}_{vtx}^{gen} (cm);#it{Z}_{vtx}^{reco}#minus#it{Z}_{vtx}^{gen} (cm); centrality; occupancy", HistType::kTHnSparseF, {ptAxis, etaAxis, deltaZAxis, deltaZAxis, deltaZAxis, centralityAxis, occupancyAxis}); hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kTrkIdGt0)] = registry.add("ReAssocMC/hVtxResIdGt0", ";#it{p}_{T}^{reco} (GeV/#it{c});#it{#eta}^{reco};#it{X}_{vtx}^{reco}#minus#it{X}_{vtx}^{gen} (cm);#it{Y}_{vtx}^{reco}#minus#it{Y}_{vtx}^{gen} (cm);#it{Z}_{vtx}^{reco}#minus#it{Z}_{vtx}^{gen} (cm); centrality; occupancy", HistType::kTHnSparseF, {ptAxis, etaAxis, deltaZAxis, deltaZAxis, deltaZAxis, centralityAxis, occupancyAxis}); hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kTrkNonAmb)] = registry.add("ReAssocMC/hVtxResNonAmb", ";#it{p}_{T}^{reco} (GeV/#it{c});#it{#eta}^{reco};#it{X}_{vtx}^{reco}#minus#it{X}_{vtx}^{gen} (cm);#it{Y}_{vtx}^{reco}#minus#it{Y}_{vtx}^{gen} (cm);#it{Z}_{vtx}^{reco}#minus#it{Z}_{vtx}^{gen} (cm); centrality; occupancy", HistType::kTHnSparseF, {ptAxis, etaAxis, deltaZAxis, deltaZAxis, deltaZAxis, centralityAxis, occupancyAxis}); hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kTrkNonAmbGood)] = registry.add("ReAssocMC/hVtxResNonAmbGood", ";#it{p}_{T}^{reco} (GeV/#it{c});#it{#eta}^{reco};#it{X}_{vtx}^{reco}#minus#it{X}_{vtx}^{gen} (cm);#it{Y}_{vtx}^{reco}#minus#it{Y}_{vtx}^{gen} (cm);#it{Z}_{vtx}^{reco}#minus#it{Z}_{vtx}^{gen} (cm); centrality; occupancy", HistType::kTHnSparseF, {ptAxis, etaAxis, deltaZAxis, deltaZAxis, deltaZAxis, centralityAxis, occupancyAxis}); @@ -1280,6 +1276,7 @@ struct DndetaMFTPbPb { hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kAssocBadIsCompFalse)] = registry.add("ReAssocMC/hVtxResAssocBadIsCompFalse", ";#it{p}_{T}^{reco} (GeV/#it{c});#it{#eta}^{reco};#it{X}_{vtx}^{reco}#minus#it{X}_{vtx}^{gen} (cm);#it{Y}_{vtx}^{reco}#minus#it{Y}_{vtx}^{gen} (cm);#it{Z}_{vtx}^{reco}#minus#it{Z}_{vtx}^{gen} (cm); centrality; occupancy", HistType::kTHnSparseF, {ptAxis, etaAxis, deltaZAxis, deltaZAxis, deltaZAxis, centralityAxis, occupancyAxis}); // DCA + hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkRec)] = registry.add("ReAssocMC/hDCARec", ";#it{p}_{T}^{reco} (GeV/#it{c});#it{#eta}^{reco};DCA_{XY} (cm)^{reco}; DCA_{Z} (cm)^{reco}; DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", HistType::kTHnSparseF, {ptAxis, etaAxis, dcaxyAxis, dcazAxis, dcaxyAxis, dcazAxis, centralityAxis, occupancyAxis}); hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkIdGt0)] = registry.add("ReAssocMC/hDCAIdGt0", ";#it{p}_{T}^{reco} (GeV/#it{c});#it{#eta}^{reco};DCA_{XY} (cm)^{reco}; DCA_{Z} (cm)^{reco}; DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", HistType::kTHnSparseF, {ptAxis, etaAxis, dcaxyAxis, dcazAxis, dcaxyAxis, dcazAxis, centralityAxis, occupancyAxis}); hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmb)] = registry.add("ReAssocMC/hDCANonAmbAll", ";#it{p}_{T}^{reco} (GeV/#it{c});#it{#eta}^{reco};DCA_{XY} (cm)^{reco}; DCA_{Z} (cm)^{reco}; DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", HistType::kTHnSparseF, {ptAxis, etaAxis, dcaxyAxis, dcazAxis, dcaxyAxis, dcazAxis, centralityAxis, occupancyAxis}); hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbGood)] = registry.add("ReAssocMC/hDCANonAmbGood", ";#it{p}_{T}^{reco} (GeV/#it{c});#it{#eta}^{reco};DCA_{XY} (cm)^{reco}; DCA_{Z} (cm)^{reco}; DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", HistType::kTHnSparseF, {ptAxis, etaAxis, dcaxyAxis, dcazAxis, dcaxyAxis, dcazAxis, centralityAxis, occupancyAxis}); @@ -1339,93 +1336,6 @@ struct DndetaMFTPbPb { qaregistry.add("Events/hNPVtracksVsMultMFT", "NPVtracks_vs_MultMFT", {HistType::kTH2F, {pvAxis, multAxis}}); } - if (doprocessSecondariesMCInlcusive || doprocessSecondariesMCCentFT0C) { - auto hNevt = registry.add("Events/hNGenRecColls", "Number of generated and reconstructed MC collisions", HistType::kTH1F, {{3, 0.5, 3.5}}); - hNevt->GetXaxis()->SetBinLabel(1, "Reconstructed collisions"); - hNevt->GetXaxis()->SetBinLabel(2, "Generated collisions"); - - if (doprocessSecondariesMCInlcusive) { - qaregistry.add("Events/hTrackToCollEvtType", ";status", {HistType::kTH1F, {{static_cast(TrackToCollEvtType::nTrackToCollEvtType), -0.5, +static_cast(TrackToCollEvtType::nTrackToCollEvtType) - 0.5}}}); - std::string labelTrkToCollEvt[CtrackToCollEvtType]; - labelTrkToCollEvt[static_cast(TrackToCollEvtType::kAllRecColl)] = "all rec"; - labelTrkToCollEvt[static_cast(TrackToCollEvtType::kIsInelGt0wMft)] = "inel>0 mft"; - labelTrkToCollEvt[static_cast(TrackToCollEvtType::kEvtSel)] = "evt sel"; - labelTrkToCollEvt[static_cast(TrackToCollEvtType::kBestCollIdx)] = "bestColl Idx (numContrib)"; - labelTrkToCollEvt[static_cast(TrackToCollEvtType::kIsMcColl)] = "is mc"; - qaregistry.get(HIST("Events/hTrackToCollEvtType"))->SetMinimum(0.1); - for (int iBin = 0; iBin < static_cast(TrackToCollEvtType::nTrackToCollEvtType); iBin++) { - qaregistry.get(HIST("Events/hTrackToCollEvtType"))->GetXaxis()->SetBinLabel(iBin + 1, labelTrkToCollEvt[iBin].data()); - } - - qaregistry.add("TrkCompColls/hAmbTrackType", ";status", {HistType::kTH1F, {{static_cast(AmbTrkType::nAmbTrkType), -0.5, +static_cast(AmbTrkType::nAmbTrkType) - 0.5}}}); - std::string labelAmbiguity[CambTrkType]; - labelAmbiguity[static_cast(AmbTrkType::kAll)] = "all"; - labelAmbiguity[static_cast(AmbTrkType::kOrphan)] = "orphan"; - labelAmbiguity[static_cast(AmbTrkType::kOrphanNull)] = "orphanNull"; - labelAmbiguity[static_cast(AmbTrkType::kNonAmb)] = "nonAmb"; - labelAmbiguity[static_cast(AmbTrkType::kNonAmbSame)] = "nonAmbSame"; - labelAmbiguity[static_cast(AmbTrkType::kAmb)] = "Amb"; - labelAmbiguity[static_cast(AmbTrkType::kAmbGt1)] = "AmbGt1"; - qaregistry.get(HIST("TrkCompColls/hAmbTrackType"))->SetMinimum(0.1); - for (int iBin = 0; iBin < static_cast(AmbTrkType::nAmbTrkType); iBin++) { - qaregistry.get(HIST("TrkCompColls/hAmbTrackType"))->GetXaxis()->SetBinLabel(iBin + 1, labelAmbiguity[iBin].data()); - } - - registry.add({"Tracks/THnRecAmb", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis}}}); - registry.add({"Tracks/THnRec", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis}}}); - registry.add({"Tracks/THnRecNonAmb", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis}}}); - registry.add({"Tracks/THnRecAmbRest", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis}}}); - registry.add({"Tracks/THnGenPrim", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis}}}); - registry.add({"Tracks/THnGenSec", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis}}}); - registry.add({"Tracks/THnGenSecWeak", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis}}}); - registry.add({"Tracks/THnGenSecMat", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis}}}); - registry.add({"Tracks/THnGenPrimAmb", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis}}}); - registry.add({"Tracks/THnGenSecAmb", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis}}}); - registry.add({"Tracks/THnGenSecWeakAmb", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis}}}); - registry.add({"Tracks/THnGenSecMatAmb", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis}}}); - } - if (doprocessSecondariesMCCentFT0C) { - qaregistry.add("Events/Centrality/hTrackToCollEvtType", ";status;centrality", {HistType::kTH2F, {{static_cast(TrackToCollEvtType::nTrackToCollEvtType), -0.5, +static_cast(TrackToCollEvtType::nTrackToCollEvtType) - 0.5}, centralityAxis}}); - std::string labelTrkToCollEvt[CtrackToCollEvtType]; - labelTrkToCollEvt[static_cast(TrackToCollEvtType::kAllRecColl)] = "all rec"; - labelTrkToCollEvt[static_cast(TrackToCollEvtType::kIsInelGt0wMft)] = "inel>0 mft"; - labelTrkToCollEvt[static_cast(TrackToCollEvtType::kEvtSel)] = "evt sel"; - labelTrkToCollEvt[static_cast(TrackToCollEvtType::kBestCollIdx)] = "bestColl Idx (numContrib)"; - labelTrkToCollEvt[static_cast(TrackToCollEvtType::kIsMcColl)] = "is mc"; - qaregistry.get(HIST("Events/Centrality/hTrackToCollEvtType"))->SetMinimum(0.1); - for (int iBin = 0; iBin < static_cast(TrackToCollEvtType::nTrackToCollEvtType); iBin++) { - qaregistry.get(HIST("Events/Centrality/hTrackToCollEvtType"))->GetXaxis()->SetBinLabel(iBin + 1, labelTrkToCollEvt[iBin].data()); - } - - qaregistry.add("TrkCompColls/Centrality/hAmbTrackType", ";status;centrality", {HistType::kTH2F, {{static_cast(AmbTrkType::nAmbTrkType), -0.5, +static_cast(AmbTrkType::nAmbTrkType) - 0.5}, centralityAxis}}); - std::string labelAmbiguity[CambTrkType]; - labelAmbiguity[static_cast(AmbTrkType::kAll)] = "all"; - labelAmbiguity[static_cast(AmbTrkType::kOrphan)] = "orphan"; - labelAmbiguity[static_cast(AmbTrkType::kOrphanNull)] = "orphanNull"; - labelAmbiguity[static_cast(AmbTrkType::kNonAmb)] = "nonAmb"; - labelAmbiguity[static_cast(AmbTrkType::kNonAmbSame)] = "nonAmbSame"; - labelAmbiguity[static_cast(AmbTrkType::kAmb)] = "Amb"; - labelAmbiguity[static_cast(AmbTrkType::kAmbGt1)] = "AmbGt1"; - qaregistry.get(HIST("TrkCompColls/Centrality/hAmbTrackType"))->SetMinimum(0.1); - for (int iBin = 0; iBin < static_cast(AmbTrkType::nAmbTrkType); iBin++) { - qaregistry.get(HIST("TrkCompColls/Centrality/hAmbTrackType"))->GetXaxis()->SetBinLabel(iBin + 1, labelAmbiguity[iBin].data()); - } - - registry.add({"Tracks/Centrality/THnRecAmb", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); centrality", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, centralityAxis}}}); - registry.add({"Tracks/Centrality/THnRec", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); centrality", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, centralityAxis}}}); - registry.add({"Tracks/Centrality/THnRecNonAmb", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); centrality", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, centralityAxis}}}); - registry.add({"Tracks/Centrality/THnRecAmbRest", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); centrality", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, centralityAxis}}}); - registry.add({"Tracks/Centrality/THnGenPrim", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); centrality", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, centralityAxis}}}); - registry.add({"Tracks/Centrality/THnGenSec", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); centrality", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, centralityAxis}}}); - registry.add({"Tracks/Centrality/THnGenSecWeak", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); centrality", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, centralityAxis}}}); - registry.add({"Tracks/Centrality/THnGenSecMat", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); centrality", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, centralityAxis}}}); - registry.add({"Tracks/Centrality/THnGenPrimAmb", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); centrality", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, centralityAxis}}}); - registry.add({"Tracks/Centrality/THnGenSecAmb", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); centrality", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, centralityAxis}}}); - registry.add({"Tracks/Centrality/THnGenSecWeakAmb", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); centrality", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, centralityAxis}}}); - registry.add({"Tracks/Centrality/THnGenSecMatAmb", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); centrality", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, centralityAxis}}}); - } - } - if (doprocessAlignmentInclusive) { for (size_t j = 0; j < mftQuadrant.size(); j++) { const auto& quadrant = mftQuadrant[j]; @@ -1435,53 +1345,6 @@ struct DndetaMFTPbPb { } } - if (doprocessReassocEfficiency) { - registry.add("Events/hNReEffColls", "Number of times generated collisions are reconstructed; N; Counts", HistType::kTH1F, {{10, -0.5, 9.5}}); - registry.add("Events/hNchTVX", "; status;", HistType::kTH2F, {multAxis, {2, 0, 2}}); - - registry.add("Events/Centrality/ReEffStatus", ";status;centrality", HistType::kTH2F, {{9, 0.5, 9.5}, centralityAxis}); - auto hstat = registry.get(HIST("Events/Centrality/ReEffStatus")); - hstat->GetXaxis()->SetBinLabel(1, "All tracks"); - hstat->GetXaxis()->SetBinLabel(2, "Ambiguous tracks"); - hstat->GetXaxis()->SetBinLabel(3, "Reassigned tracks"); - hstat->GetXaxis()->SetBinLabel(4, "Extra tracks"); - hstat->GetXaxis()->SetBinLabel(5, "Originally correctly reassgined"); - hstat->GetXaxis()->SetBinLabel(6, "Correctly reassigned"); - hstat->GetXaxis()->SetBinLabel(7, "Not reassigned (reassigned)"); - hstat->GetXaxis()->SetBinLabel(8, "Not reassigned"); - hstat->GetXaxis()->SetBinLabel(9, "Correctly assigned true"); - - registry.add({"AmbTracks/hVtxzMCrec", " ; Z_{vtx} (cm)", {HistType::kTH1F, {zAxis}}}); - registry.add({"AmbTracks/DCAXY", " ; DCA_{XY} (cm)", {HistType::kTH1F, {dcaxyAxis}}}); - registry.add({"AmbTracks/DCAZ", " ; DCA_{Z} (cm); centrality; occupancy", {HistType::kTH1F, {dcazAxis}}}); - registry.add({"AmbTracks/DCAXYBest", " ; DCA_{XY} (cm)", {HistType::kTH1F, {dcaxyAxis}}}); - registry.add({"AmbTracks/DCAZBest", " ; DCA_{Z} (cm); centrality; occupancy", {HistType::kTH1F, {dcazAxis}}}); - registry.add({"AmbTracks/DCAXYBestPrim", " ; DCA_{XY} (cm)", {HistType::kTH1F, {dcaxyAxis}}}); - registry.add({"AmbTracks/DCAZBestPrim", " ; DCA_{Z} (cm); centrality; occupancy", {HistType::kTH1F, {dcazAxis}}}); - registry.add({"AmbTracks/DCAXYBestTrue", " ; DCA_{XY} (cm)", {HistType::kTH1F, {dcaxyAxis}}}); - registry.add({"AmbTracks/DCAZBestTrue", " ; DCA_{Z} (cm); centrality; occupancy", {HistType::kTH1F, {dcazAxis}}}); - registry.add({"AmbTracks/DCAXYBestFalse", " ; DCA_{XY} (cm)", {HistType::kTH1F, {dcaxyAxis}}}); - registry.add({"AmbTracks/DCAZBestFalse", " ; DCA_{Z} (cm); centrality; occupancy", {HistType::kTH1F, {dcazAxis}}}); - registry.add({"AmbTracks/DCAXYBestTrueOrigAssoc", " ; DCA_{XY} (cm)", {HistType::kTH1F, {dcaxyAxis}}}); - registry.add({"AmbTracks/DCAXYBestTrueOrigReAssoc", " ; DCA_{XY} (cm)", {HistType::kTH1F, {dcaxyAxis}}}); - registry.add({"AmbTracks/DCAZBestTrueOrigAssoc", " ; DCA_{Z} (cm); centrality; occupancy", {HistType::kTH1F, {dcazAxis}}}); - registry.add({"AmbTracks/DCAZBestTrueOrigReAssoc", " ; DCA_{Z} (cm); centrality; occupancy", {HistType::kTH1F, {dcazAxis}}}); - - registry.add({"AmbTracks/Centrality/THnDCAxyBestGen", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis}}}); - registry.add({"AmbTracks/Centrality/THnDCAxyBestGenPrim", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis}}}); - registry.add({"AmbTracks/Centrality/THnDCAxyBestTrue", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis}}}); - registry.add({"AmbTracks/Centrality/THnDCAxyBestFalse", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis}}}); - registry.add({"AmbTracks/Centrality/THnDCAxyBestTrueOrigAssoc", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis}}}); - registry.add({"AmbTracks/Centrality/THnDCAxyBestTrueOrigReAssoc", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis}}}); - - registry.add({"AmbTracks/BestGenDxyz", "; #Delta X (cm); #Delta Y (cm); #Delta Z (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {deltaZAxis, deltaZAxis, deltaZAxis, dcaxyAxis, dcazAxis}}}); - registry.add({"AmbTracks/BestPrimDxyz", "; #Delta X (cm); #Delta Y (cm); #Delta Z (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {deltaZAxis, deltaZAxis, deltaZAxis, dcaxyAxis, dcazAxis}}}); - registry.add({"AmbTracks/BestTrueDxyz", "; #Delta X (cm); #Delta Y (cm); #Delta Z (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {deltaZAxis, deltaZAxis, deltaZAxis, dcaxyAxis, dcazAxis}}}); - registry.add({"AmbTracks/BestFalseDxyz", "; #Delta X (cm); #Delta Y (cm); #Delta Z (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {deltaZAxis, deltaZAxis, deltaZAxis, dcaxyAxis, dcazAxis}}}); - registry.add({"AmbTracks/BestTrueOrigReAssocDxyz", "; #Delta X (cm); #Delta Y (cm); #Delta Z (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {deltaZAxis, deltaZAxis, deltaZAxis, dcaxyAxis, dcazAxis}}}); - registry.add({"AmbTracks/BestTrueOrigAssocDxyz", "; #Delta X (cm); #Delta Y (cm); #Delta Z (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {deltaZAxis, deltaZAxis, deltaZAxis, dcaxyAxis, dcazAxis}}}); - } - if (doprocessEventAndSignalLossCentFT0C) { auto hNevt = registry.add("Events/Centrality/hNRecCollsSigEvtLoss", "Number of reconstructed MC collisions", HistType::kTH1F, {{1, 0.5, 1.5}}); hNevt->GetXaxis()->SetBinLabel(1, "Reconstructed collisions"); @@ -1667,6 +1530,52 @@ struct DndetaMFTPbPb { hTimeAssocWithReassocMC[19] = registry.add("TimeAssocWithReassocMC/hDCAReassocBestRecGoodVtxFlagBad", ";#it{X}_{vtx}^{reco}#minus#it{X}_{vtx}^{gen} (cm);#it{Y}_{vtx}^{reco}#minus#it{Y}_{vtx}^{gen} (cm);#it{Z}_{vtx}^{reco}#minus#it{Z}_{vtx}^{gen} (cm)", HistType::kTHnSparseF, {deltaZAxis, deltaZAxis, deltaZAxis}); hTimeAssocWithReassocMC[20] = registry.add("TimeAssocWithReassocMC/hDCAReassocBestRecGoodMatchVtxFlagBad", ";#it{X}_{vtx}^{reco}#minus#it{X}_{vtx}^{gen} (cm);#it{Y}_{vtx}^{reco}#minus#it{Y}_{vtx}^{gen} (cm);#it{Z}_{vtx}^{reco}#minus#it{Z}_{vtx}^{gen} (cm)", HistType::kTHnSparseF, {deltaZAxis, deltaZAxis, deltaZAxis}); } + + if (doprocessDCAReassocMcInclusive || doprocessDCAReassocMcCentFT0C) { + if (doprocessDCAReassocMcInclusive) { + registry.add({"Events/EvtGenRecReassoc", ";status", {HistType::kTH2F, {{4, 0.5, 4.5}, occupancyAxis}}}); + auto heff = registry.get(HIST("Events/EvtGenRecReassoc")); + auto* h = heff->GetXaxis(); + h->SetBinLabel(1, "All generated"); + h->SetBinLabel(2, "All reconstructed"); + h->SetBinLabel(3, "Selected reconstructed"); + h->SetBinLabel(4, "Remove split vertices"); + + registry.add({"Tracks/THnDCAxyBestRec", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis}}}); + registry.add({"Tracks/THnDCAxyBestRecFake", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis}}}); + registry.add({"Tracks/THnDCAxyBestGenPrim", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis}}}); + registry.add({"Tracks/THnDCAxyBestGenTruthPrim", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis}}}); + registry.add({"Tracks/THnDCAxyBestGenPrimWrongColl", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis}}}); + registry.add({"Tracks/THnDCAxyBestGenTruthPrimWrongColl", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis}}}); + registry.add({"Tracks/THnDCAxyBestGenSec", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis}}}); + registry.add({"Tracks/THnDCAxyBestGenTruthSec", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis}}}); + registry.add({"Tracks/THnDCAxyBestGenSecWrongColl", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis}}}); + registry.add({"Tracks/THnDCAxyBestGenTruthSecWrongColl", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis}}}); + registry.add({"Tracks/THnDCAxyBestGenSecWeak", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis}}}); + registry.add({"Tracks/THnDCAxyBestGenSecMat", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis}}}); + } + if (doprocessDCAReassocMcCentFT0C) { + registry.add({"Events/Centrality/EvtGenRecReassoc", ";status;centrality", {HistType::kTHnSparseF, {{4, 0.5, 4.5}, centralityAxis, occupancyAxis}}}); + auto heff = registry.get(HIST("Events/Centrality/EvtGenRecReassoc")); + heff->GetAxis(0)->SetBinLabel(1, "All generated"); + heff->GetAxis(0)->SetBinLabel(2, "All reconstructed"); + heff->GetAxis(0)->SetBinLabel(3, "Selected reconstructed"); + heff->GetAxis(0)->SetBinLabel(4, "Remove split vertices"); + + registry.add({"Tracks/Centrality/THnDCAxyBestRec", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis, occupancyAxis}}}); + registry.add({"Tracks/Centrality/THnDCAxyBestRecFake", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis, occupancyAxis}}}); + registry.add({"Tracks/Centrality/THnDCAxyBestGenPrim", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis, occupancyAxis}}}); + registry.add({"Tracks/Centrality/THnDCAxyBestGenTruthPrim", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis, occupancyAxis}}}); + registry.add({"Tracks/Centrality/THnDCAxyBestGenPrimWrongColl", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis, occupancyAxis}}}); + registry.add({"Tracks/Centrality/THnDCAxyBestGenTruthPrimWrongColl", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm)", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis, occupancyAxis}}}); + registry.add({"Tracks/Centrality/THnDCAxyBestGenSec", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis, occupancyAxis}}}); + registry.add({"Tracks/Centrality/THnDCAxyBestGenTruthSec", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis, occupancyAxis}}}); + registry.add({"Tracks/Centrality/THnDCAxyBestGenSecWrongColl", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis, occupancyAxis}}}); + registry.add({"Tracks/Centrality/THnDCAxyBestGenTruthSecWrongColl", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis, occupancyAxis}}}); + registry.add({"Tracks/Centrality/THnDCAxyBestGenSecWeak", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis, occupancyAxis}}}); + registry.add({"Tracks/Centrality/THnDCAxyBestGenSecMat", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); DCA_{XY} (cm); DCA_{Z} (cm); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, zAxis, dcaxyAxis, dcazAxis, centralityAxis, occupancyAxis}}}); + } + } } /// Filters - tracks @@ -1676,9 +1585,6 @@ struct DndetaMFTPbPb { Filter filtATrackDCAxy = (nabs(aod::fwdtrack::bestDCAXY) < trackCuts.maxDCAxy); Filter filtATrackDCAz = (nabs(aod::fwdtrack::bestDCAZ) < trackCuts.maxDCAz); - /// Filters - mc particles - Filter primaries = (aod::mcparticle::flags & (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary) == (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary && (aod::mcparticle::eta < trackCuts.maxEta) && (aod::mcparticle::eta > trackCuts.minEta); - /// Joined tables using FullBCs = soa::Join; using CollBCs = soa::Join; @@ -1708,17 +1614,11 @@ struct DndetaMFTPbPb { using MftTracksWColls = soa::Join; using MftTracksWCollsMC = soa::Join; using BestTracksMC = soa::Join; - using BestTracks2dWCollsMC = soa::Join; using BestTracks3dWCollsMC = soa::Join; /// Filtered tables using FiltMftTracks = soa::Filtered; - using FiltMcMftTracks = soa::Filtered; - using FiltMcMftTracksWColls = soa::Filtered; using FiltBestTracks = soa::Filtered; - using FiltMcBestTracks = soa::Filtered; - - using FiltParticles = soa::Filtered; template float getDCAz(const T& track) @@ -2642,17 +2542,17 @@ struct DndetaMFTPbPb { "Count tracks in MFT centrality bins based on BestCollisionsFwd3d table", false); - Preslice perCol = o2::aod::fwdtrack::collisionId; + Preslice perCol = o2::aod::fwdtrack::collisionId; PresliceUnsorted recColPerMcCol = aod::mccollisionlabel::mcCollisionId; - Partition mcSample = (aod::mcparticle::eta < trackCuts.maxEta) && (aod::mcparticle::eta > trackCuts.minEta); + Partition mcSample = (aod::mcparticle::eta < trackCuts.maxEta) && (aod::mcparticle::eta > trackCuts.minEta); /// @brief process template function to run on MC gen template void processMC( typename MC::iterator const& mcCollision, soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks) + aod::McParticles const& particles, MFTTracksLabeled const& tracks) { bool gtZeroColl = false; int gtOneColl = 0; @@ -2776,7 +2676,7 @@ struct DndetaMFTPbPb { void processMCInclusive( aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks) + aod::McParticles const& particles, MFTTracksLabeled const& tracks) { processMC(mccollision, collisions, particles, tracks); @@ -2788,7 +2688,7 @@ struct DndetaMFTPbPb { void processMCCentFT0C( aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks) + aod::McParticles const& particles, MFTTracksLabeled const& tracks) { processMC(mccollision, collisions, particles, tracks); @@ -2801,7 +2701,7 @@ struct DndetaMFTPbPb { aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks) + aod::McParticles const& particles, MFTTracksLabeled const& tracks) { processMC(mccollision, collisions, particles, tracks); @@ -2813,7 +2713,7 @@ struct DndetaMFTPbPb { void processMCCentFT0M( aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks) + aod::McParticles const& particles, MFTTracksLabeled const& tracks) { processMC(mccollision, collisions, particles, tracks); @@ -2826,7 +2726,7 @@ struct DndetaMFTPbPb { aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks) + aod::McParticles const& particles, MFTTracksLabeled const& tracks) { processMC(mccollision, collisions, particles, tracks); @@ -2838,7 +2738,7 @@ struct DndetaMFTPbPb { void processMCCentMFT( aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks) + aod::McParticles const& particles, MFTTracksLabeled const& tracks) { processMC(mccollision, collisions, particles, tracks); @@ -2856,7 +2756,7 @@ struct DndetaMFTPbPb { void processMCwBestTracks( typename MC::iterator const& mcCollision, soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks, + aod::McParticles const& particles, MFTTracksLabeled const& tracks, FiltBestTracks const& besttracks) { bool gtZeroColl = false; @@ -2952,7 +2852,7 @@ struct DndetaMFTPbPb { void processMCwBestTracksInclusive( aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks, + aod::McParticles const& particles, MFTTracksLabeled const& tracks, FiltBestTracks const& besttracks) { processMCwBestTracks( @@ -2966,7 +2866,7 @@ struct DndetaMFTPbPb { void processMCwBestTracksCentFT0C( aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks, + aod::McParticles const& particles, MFTTracksLabeled const& tracks, FiltBestTracks const& besttracks) { processMCwBestTracks( @@ -2981,7 +2881,7 @@ struct DndetaMFTPbPb { aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks, + aod::McParticles const& particles, MFTTracksLabeled const& tracks, FiltBestTracks const& besttracks) { processMCwBestTracks( @@ -2996,7 +2896,7 @@ struct DndetaMFTPbPb { void processMCwBestTracksCentFT0M( aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks, + aod::McParticles const& particles, MFTTracksLabeled const& tracks, FiltBestTracks const& besttracks) { processMCwBestTracks( @@ -3011,7 +2911,7 @@ struct DndetaMFTPbPb { aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks, + aod::McParticles const& particles, MFTTracksLabeled const& tracks, FiltBestTracks const& besttracks) { processMCwBestTracks( @@ -3026,7 +2926,7 @@ struct DndetaMFTPbPb { void processMCwBestTracksCentMFT( aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks, + aod::McParticles const& particles, MFTTracksLabeled const& tracks, FiltBestTracks const& besttracks) { processMCwBestTracks( @@ -3320,13 +3220,13 @@ struct DndetaMFTPbPb { PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffIdxCentFT0C, "Process tracking efficiency (in FT0C centrality bins, indexed)", false); - /// @brief process function to calculate tracking efficiency (indexed) based + /// @brief process function to calculate tracking efficiency based /// on BestCollisionsFwd3d in FT0C bins template void processTrkEffBest( typename soa::Join::iterator const& collision, - MC const& /*mccollisions*/, FiltParticles const& particles, - FiltMcMftTracks const& tracks, + MC const& /*mccollisions*/, aod::McParticles const& particles, + MFTTracksLabeled const& tracks, soa::SmallGroups const& besttracks) { if (!isGoodEvent(collision)) { @@ -3368,15 +3268,15 @@ struct DndetaMFTPbPb { if (!isBestTrackSelected(track)) { continue; } - auto itrack = track.mfttrack_as(); + auto itrack = track.mfttrack_as(); if (itrack.collisionId() != track.bestCollisionId()) { reassignedTrkIdsMC.emplace_back(track.mfttrackId()); } if (!isTrackSelected(itrack)) { continue; } - if (itrack.has_mcParticle()) { - auto particle = itrack.mcParticle_as(); + if (itrack.has_mcParticle() && itrack.mcMask() == trackCuts.selMcMask) { + auto particle = itrack.mcParticle_as(); if (itrack.eta() > trackCuts.minEta && itrack.eta() < trackCuts.maxEta) { if constexpr (has_reco_cent) { qaregistry.fill(HIST("Tracks/Centrality/hPtPhiEtaZvtxEffBestRec"), @@ -3407,8 +3307,8 @@ struct DndetaMFTPbPb { if (!isTrackSelected(track)) { continue; } - if (track.has_mcParticle()) { - auto particle = track.mcParticle_as(); + if (track.has_mcParticle() && track.mcMask() == trackCuts.selMcMask) { + auto particle = track.mcParticle_as(); if (track.eta() > trackCuts.minEta && track.eta() < trackCuts.maxEta) { if constexpr (has_reco_cent) { qaregistry.fill(HIST("Tracks/Centrality/hPtPhiEtaZvtxEffBestRec"), @@ -3436,8 +3336,8 @@ struct DndetaMFTPbPb { void processTrkEffBestInclusive( soa::Join::iterator const& collision, - aod::McCollisions const& mccollisions, FiltParticles const& particles, - FiltMcMftTracks const& tracks, + aod::McCollisions const& mccollisions, aod::McParticles const& particles, + MFTTracksLabeled const& tracks, soa::SmallGroups const& besttracks) { processTrkEffBest(collision, mccollisions, @@ -3450,8 +3350,8 @@ struct DndetaMFTPbPb { void processTrkEffBestCentFT0C( soa::Join::iterator const& collision, - aod::McCollisions const& mccollisions, FiltParticles const& particles, - FiltMcMftTracks const& tracks, + aod::McCollisions const& mccollisions, aod::McParticles const& particles, + MFTTracksLabeled const& tracks, soa::SmallGroups const& besttracks) { processTrkEffBest( @@ -3463,15 +3363,15 @@ struct DndetaMFTPbPb { "on BestCollisionsFwd3d)", false); - Preslice filtMcTrkperCol = o2::aod::fwdtrack::collisionId; + Preslice filtMcTrkperCol = o2::aod::fwdtrack::collisionId; /// @brief process function to calculate MC efficiency and fraction of fake /// tracks template void processEfficiency( typename soa::Join const& collisions, - MC const& /*mccollisions*/, FiltParticles const& /*particles*/, - FiltMcMftTracks const& tracks) + MC const& /*mccollisions*/, aod::McParticles const& /*particles*/, + MFTTracksLabeled const& tracks) { for (auto const& collision : collisions) { if (!isGoodEvent(collision)) { @@ -3488,8 +3388,8 @@ struct DndetaMFTPbPb { if (!isTrackSelected(track)) { continue; } - if (track.has_mcParticle()) { - auto particle = track.template mcParticle_as(); + if (track.has_mcParticle() && track.mcMask() == trackCuts.selMcMask) { + auto particle = track.template mcParticle_as(); if constexpr (has_reco_cent) { qaregistry.fill(HIST("Tracks/Centrality/hEffRec"), particle.pt(), particle.phi(), particle.eta(), mcCollision.posZ(), @@ -3515,8 +3415,8 @@ struct DndetaMFTPbPb { void processEfficiencyInclusive( soa::Join const& collisions, - aod::McCollisions const& mccollisions, FiltParticles const& particles, - FiltMcMftTracks const& tracks) + aod::McCollisions const& mccollisions, aod::McParticles const& particles, + MFTTracksLabeled const& tracks) { processEfficiency(collisions, mccollisions, particles, tracks); @@ -3527,8 +3427,8 @@ struct DndetaMFTPbPb { void processEfficiencyCentFT0C( soa::Join const& collisions, - aod::McCollisions const& mccollisions, FiltParticles const& particles, - FiltMcMftTracks const& tracks) + aod::McCollisions const& mccollisions, aod::McParticles const& particles, + MFTTracksLabeled const& tracks) { processEfficiency( collisions, mccollisions, particles, tracks); @@ -3650,7 +3550,7 @@ struct DndetaMFTPbPb { /// @brief process function to calculate signal loss based on MC void processEventAndSignalLossCentFT0C(CollsMCExtraMult::iterator const& mcCollision, soa::SmallGroups> const& collisions, - FiltParticles const& particles) + aod::McParticles const& particles) { registry.fill(HIST("Events/Centrality/hNRecCollsSigEvtLoss"), 1.f, collisions.size()); @@ -3735,7 +3635,7 @@ struct DndetaMFTPbPb { MFTTracksLabeled const& tracks, aod::AmbiguousMFTTracks const& atracks, aod::McCollisions const& mcCollisions, - FiltParticles const& /*particles*/) + aod::McParticles const& /*particles*/) { for (const auto& collision : collisions) { float crec = getRecoCent(collision); @@ -3959,7 +3859,7 @@ struct DndetaMFTPbPb { float deltaYv2 = -1.; float deltaZv2 = -1.; - if (track.collisionId() >= 0 && track.has_mcParticle() && track.mcMask() == 0) { + if (track.collisionId() >= 0 && track.has_mcParticle() && track.mcMask() == trackCuts.selMcMask) { const auto& mcPart = track.mcParticle(); if (!isChrgParticle(mcPart.pdgCode())) { continue; @@ -4144,7 +4044,7 @@ struct DndetaMFTPbPb { void processTimeAssocWithReassocMC(CollsMCExtra const& mcCollisions, CollisionsWithMCLabels const& collisions, - FiltMcMftTracksWColls const& /*tracks*/, + MftTracksWCollsMC const& /*tracks*/, BestTracks3dWCollsMC const& besttracks, aod::McParticles const& /*particles*/, aod::McCollisionLabels const& labels, @@ -4240,7 +4140,7 @@ struct DndetaMFTPbPb { if (!isBestTrackSelected(atrack)) { continue; } - auto itrack = atrack.mfttrack_as(); + auto itrack = atrack.mfttrack_as(); if (!isTrackSelected(itrack)) { continue; } @@ -4268,7 +4168,7 @@ struct DndetaMFTPbPb { float deltaY = -1.; float deltaZ = -1.; - if (trkBestCollId >= 0 && atrack.has_mcParticle() && atrack.mcMask() == 0) { + if (trkBestCollId >= 0 && atrack.has_mcParticle() && atrack.mcMask() == trackCuts.selMcMask) { auto itRecToMc = mapRecToMc.find(trkBestCollId); // try mfttrackId ??? int64_t mcPartId = atrack.mcParticle().mcCollisionId(); auto const& idCompColl = atrack.compatibleCollIds(); @@ -4465,8 +4365,8 @@ struct DndetaMFTPbPb { int nTrk = 0, nFakeTrk = 0, nGoodTrk = 0; for (const auto& track : tracks) { uint index = uint(track.collisionId() >= 0); - if (track.has_mcParticle() && track.mcMask() == 0) { - // auto particle = track.mcParticle_as(); + if (track.has_mcParticle() && track.mcMask() == trackCuts.selMcMask) { + // auto particle = track.mcParticle_as(); const auto& particle = track.mcParticle(); auto trkCollId = track.has_collision() ? track.collisionId() : -1; auto ids = track.compatibleCollIds(); @@ -4565,10 +4465,12 @@ struct DndetaMFTPbPb { PROCESS_SWITCH(DndetaMFTPbPb, processAssocMC, "Process collision-association information, requires extra table from TrackToCollisionAssociation task (fillTableOfCollIdsPerTrack=true)", false); + PresliceUnsorted perColBest = aod::fwdtrack::bestCollisionId; + template void processReAssocMC(typename soa::Join const& collisions, B const& besttracks, - FiltMcMftTracksWColls const& /*tracks*/, + MftTracksWCollsMC const& /*tracks*/, aod::McCollisions const& /*mcCollisions*/, aod::McParticles const& /*particles*/ ) @@ -4662,7 +4564,9 @@ struct DndetaMFTPbPb { } registry.fill(HIST("ReAssocMC/hReAssocMCEventStatus"), static_cast(ReAssocMCEventStatus::kEvtReAsZVtxCutMC), crec, occ); - for (auto const& atrack : besttracks) { + auto perCollisionASample = besttracks.sliceBy(perColBest, collision.globalIndex()); + for (auto const& atrack : perCollisionASample) { + // for (auto const& atrack : besttracks) { registry.fill(HIST("ReAssocMC/hReAssocMCTrackStatus"), static_cast(ReAssocMCTrackStatus::kTrkReAssocAll), crec, occ); if (!isBestTrackSelected(atrack)) { continue; @@ -4670,7 +4574,7 @@ struct DndetaMFTPbPb { registry.fill(HIST("ReAssocMC/hReAssocMCTrackStatus"), static_cast(ReAssocMCTrackStatus::kTrkBestSel), crec, occ); const float bestDcaZ = getDCAz(atrack); - auto itrack = atrack.template mfttrack_as(); + auto itrack = atrack.template mfttrack_as(); if (!isTrackSelected(itrack)) { continue; } @@ -4687,9 +4591,6 @@ struct DndetaMFTPbPb { registry.fill(HIST("ReAssocMC/hReAssocMCTrackStatus"), static_cast(ReAssocMCTrackStatus::kTrkReassignedRemoved), crec, occ); auto ids = atrack.compatibleCollIds(); - if (gConf.cfgRemoveOrphanTracks && ids.empty()) { - continue; - } if (gConf.cfgRemoveTrivialAssoc) { if (ids.empty() || (ids.size() == 1 && itrack.collisionId() == ids[0])) { continue; @@ -4698,7 +4599,11 @@ struct DndetaMFTPbPb { if (gConf.cfgRemoveAmbiguousTracks && (ids.size() != 1)) { continue; } - if (itrack.collisionId() >= 0 && itrack.has_mcParticle() && itrack.mcMask() == 0) { + + hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kTrkRec)]->Fill(itrack.pt(), itrack.eta(), 0., 0., 0., crec, occ); + hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkRec)]->Fill(itrack.pt(), itrack.eta(), atrack.bestDCAXY(), bestDcaZ, 0., 0., crec, occ); + + if (itrack.collisionId() >= 0 && itrack.has_mcParticle() && itrack.mcMask() == trackCuts.selMcMask) { auto particle = itrack.template mcParticle_as(); if (!isChrgParticle(particle.pdgCode())) { @@ -4708,6 +4613,11 @@ struct DndetaMFTPbPb { continue; } // auto collision = itrack.template collision_as(); + if (eventCuts.useZDiffCut) { + if (std::abs(collision.posZ() - atrack.mcParticle().mcCollision().posZ()) > eventCuts.maxZvtxDiff) { + continue; + } + } float deltaX = -999.f; float deltaY = -999.f; @@ -4754,34 +4664,38 @@ struct DndetaMFTPbPb { registry.fill(HIST("ReAssocMC/hReAssocMCTrackStatus"), static_cast(ReAssocMCTrackStatus::kTrkHasMcPart), crec, occ); if (ids.size() > 0) { - registry.fill(HIST("ReAssocMC/hReAssocMCTrackStatus"), static_cast(ReAssocMCTrackStatus::kTrkIdGt0), crec, occ); - hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kTrkIdGt0)]->Fill(itrack.pt(), itrack.eta(), deltaX, deltaY, deltaZ, crec, occ); - hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkIdGt0)]->Fill(itrack.pt(), itrack.eta(), 0., 0., dcaXYtruth, dcaZtruth, crec, occ); + if (collision.has_mcCollision() && mcCollIdRec == particle.mcCollisionId()) { // good coll + if (isRecInCompColl(atrack)) { // coll vertex is among compatible colls + registry.fill(HIST("ReAssocMC/hReAssocMCTrackStatus"), static_cast(ReAssocMCTrackStatus::kTrkIdGt0), crec, occ); + hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kTrkIdGt0)]->Fill(itrack.pt(), itrack.eta(), deltaX, deltaY, deltaZ, crec, occ); + hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkIdGt0)]->Fill(itrack.pt(), itrack.eta(), atrack.bestDCAXY(), bestDcaZ, dcaXYtruth, dcaZtruth, crec, occ); + } + } if (ids.size() == 1) { registry.fill(HIST("ReAssocMC/hReAssocMCTrackStatus"), static_cast(ReAssocMCTrackStatus::kTrkNonAmb), crec, occ); hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kTrkNonAmb)]->Fill(itrack.pt(), itrack.eta(), deltaX, deltaY, deltaZ, crec, occ); - hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmb)]->Fill(itrack.pt(), itrack.eta(), 0., 0., dcaXYtruth, dcaZtruth, crec, occ); + hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmb)]->Fill(itrack.pt(), itrack.eta(), atrack.bestDCAXY(), bestDcaZ, dcaXYtruth, dcaZtruth, crec, occ); if (collision.mcCollisionId() == particle.mcCollisionId()) { registry.fill(HIST("ReAssocMC/hReAssocMCTrackStatus"), static_cast(ReAssocMCTrackStatus::kTrkNonAmbGood), crec, occ); hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kTrkNonAmbGood)]->Fill(itrack.pt(), itrack.eta(), deltaX, deltaY, deltaZ, crec, occ); - hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbGood)]->Fill(itrack.pt(), itrack.eta(), 0., 0., dcaXYtruth, dcaZtruth, crec, occ); + hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbGood)]->Fill(itrack.pt(), itrack.eta(), atrack.bestDCAXY(), bestDcaZ, dcaXYtruth, dcaZtruth, crec, occ); } else { registry.fill(HIST("ReAssocMC/hReAssocMCTrackStatus"), static_cast(ReAssocMCTrackStatus::kTrkNonAmbBad), crec, occ); hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kTrkNonAmbBad)]->Fill(itrack.pt(), itrack.eta(), deltaX, deltaY, deltaZ, crec, occ); - hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbBad)]->Fill(itrack.pt(), itrack.eta(), 0., 0., dcaXYtruth, dcaZtruth, crec, occ); + hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbBad)]->Fill(itrack.pt(), itrack.eta(), atrack.bestDCAXY(), bestDcaZ, dcaXYtruth, dcaZtruth, crec, occ); } if (itrack.collisionId() == ids[0]) { // non ambiguous registry.fill(HIST("ReAssocMC/hReAssocMCTrackStatus"), static_cast(ReAssocMCTrackStatus::kTrkNonAmbID), crec, occ); hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kTrkNonAmbID)]->Fill(itrack.pt(), itrack.eta(), deltaX, deltaY, deltaZ, crec, occ); - hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbID)]->Fill(itrack.pt(), itrack.eta(), 0., 0., dcaXYtruth, dcaZtruth, crec, occ); + hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbID)]->Fill(itrack.pt(), itrack.eta(), atrack.bestDCAXY(), bestDcaZ, dcaXYtruth, dcaZtruth, crec, occ); if (collision.mcCollisionId() == particle.mcCollisionId()) { registry.fill(HIST("ReAssocMC/hReAssocMCTrackStatus"), static_cast(ReAssocMCTrackStatus::kTrkNonAmbIDGood), crec, occ); hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kTrkNonAmbIDGood)]->Fill(itrack.pt(), itrack.eta(), deltaX, deltaY, deltaZ, crec, occ); - hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbIDGood)]->Fill(itrack.pt(), itrack.eta(), 0., 0., dcaXYtruth, dcaZtruth, crec, occ); + hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbIDGood)]->Fill(itrack.pt(), itrack.eta(), atrack.bestDCAXY(), bestDcaZ, dcaXYtruth, dcaZtruth, crec, occ); } else { registry.fill(HIST("ReAssocMC/hReAssocMCTrackStatus"), static_cast(ReAssocMCTrackStatus::kTrkNonAmbIDBad), crec, occ); hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kTrkNonAmbIDBad)]->Fill(itrack.pt(), itrack.eta(), deltaX, deltaY, deltaZ, crec, occ); - hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbIDBad)]->Fill(itrack.pt(), itrack.eta(), 0., 0., dcaXYtruth, dcaZtruth, crec, occ); + hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbIDBad)]->Fill(itrack.pt(), itrack.eta(), atrack.bestDCAXY(), bestDcaZ, dcaXYtruth, dcaZtruth, crec, occ); } } else if (itrack.collisionId() != ids[0]) { // ambiguous extra registry.fill(HIST("ReAssocMC/hReAssocMCTrackStatus"), static_cast(ReAssocMCTrackStatus::kTrkAmbID), crec, occ); @@ -4799,15 +4713,15 @@ struct DndetaMFTPbPb { } else { // non ambiguous (extra) registry.fill(HIST("ReAssocMC/hReAssocMCTrackStatus"), static_cast(ReAssocMCTrackStatus::kTrkNonAmbIDExtra), crec, occ); hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kTrkNonAmbIDExtra)]->Fill(itrack.pt(), itrack.eta(), deltaX, deltaY, deltaZ, crec, occ); - hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbIDExtra)]->Fill(itrack.pt(), itrack.eta(), 0., 0., dcaXYtruth, dcaZtruth, crec, occ); + hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbIDExtra)]->Fill(itrack.pt(), itrack.eta(), atrack.bestDCAXY(), bestDcaZ, dcaXYtruth, dcaZtruth, crec, occ); if (collision.mcCollisionId() == particle.mcCollisionId()) { registry.fill(HIST("ReAssocMC/hReAssocMCTrackStatus"), static_cast(ReAssocMCTrackStatus::kTrkNonAmbIDExtraGood), crec, occ); hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kTrkNonAmbIDExtraGood)]->Fill(itrack.pt(), itrack.eta(), deltaX, deltaY, deltaZ, crec, occ); - hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbIDExtraGood)]->Fill(itrack.pt(), itrack.eta(), 0., 0., dcaXYtruth, dcaZtruth, crec, occ); + hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbIDExtraGood)]->Fill(itrack.pt(), itrack.eta(), atrack.bestDCAXY(), bestDcaZ, dcaXYtruth, dcaZtruth, crec, occ); } else { registry.fill(HIST("ReAssocMC/hReAssocMCTrackStatus"), static_cast(ReAssocMCTrackStatus::kTrkNonAmbIDExtraBad), crec, occ); hReAssocVtxRes[static_cast(HistStatusReAssocVtx::kTrkNonAmbIDExtraBad)]->Fill(itrack.pt(), itrack.eta(), deltaX, deltaY, deltaZ, crec, occ); - hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbIDExtraBad)]->Fill(itrack.pt(), itrack.eta(), 0., 0., dcaXYtruth, dcaZtruth, crec, occ); + hReAssocDCA[static_cast(HistStatusReAssocVtx::kTrkNonAmbIDExtraBad)]->Fill(itrack.pt(), itrack.eta(), atrack.bestDCAXY(), bestDcaZ, dcaXYtruth, dcaZtruth, crec, occ); } } } else { // ambiguous @@ -4889,19 +4803,9 @@ struct DndetaMFTPbPb { } } - void processReAssoc2dMC(soa::Join const& collisions, - BestTracks2dWCollsMC const& besttracks, - FiltMcMftTracksWColls const& tracks, - aod::McCollisions const& mcCollisions, - aod::McParticles const& particles) - { - processReAssocMC(collisions, besttracks, tracks, mcCollisions, particles); - } - PROCESS_SWITCH(DndetaMFTPbPb, processReAssoc2dMC, "Process re-association information based on BestCollisionsFwd (2D) table", false); - void processReAssoc3dMC(soa::Join const& collisions, BestTracks3dWCollsMC const& besttracks, - FiltMcMftTracksWColls const& tracks, + MftTracksWCollsMC const& tracks, aod::McCollisions const& mcCollisions, aod::McParticles const& particles) { @@ -4909,522 +4813,207 @@ struct DndetaMFTPbPb { } PROCESS_SWITCH(DndetaMFTPbPb, processReAssoc3dMC, "Process re-association information based on BestCollisionsFwd3d (3D) table", true); - Preslice compCollPerCol = o2::aod::fwdtrack::collisionId; + PresliceUnsorted perColBestTrks = aod::fwdtrack::bestCollisionId; - /// @brief process function to check reassociation efficiency - void processReassocEfficiency(CollsMCExtraMult::iterator const& mcCollision, - soa::SmallGroups const& collisions, - MftTracksWCollsMC const& tracks, - aod::McParticles const& particles, - ExtBCs const& bcs) + template + void processDCAReassocMc(typename MC::iterator const& mcCollision, + soa::SmallGroups> const& collisions, + aod::McParticles const& /*particles*/, + BestTracksMC const& besttracks, + MFTTracksLabeled const& /*tracks*/ + ) { - if (bcs.size() == 0) { - return; - } - auto bc = bcs.begin(); - initCCDB(bc); - - // At least one generated primary in MFT acceptance + TVX triggered collisions - if (gConf.cfgUseInelgt0wMFT && !isInelGt0wMft(particles)) { - return; - } - if (eventCuts.useZVtxCutMC && (std::abs(mcCollision.posZ()) >= eventCuts.maxZvtx)) { - return; - } - - const auto& nRecoColls = collisions.size(); - registry.fill(HIST("Events/hNReEffColls"), 1.f, nRecoColls); - - // Generated evets with >= 1 reco collisions - if (nRecoColls > CintZero) { - - auto maxNcontributors = -1; - auto bestCollIndex = -1; - auto crec = -1; - for (auto const& collision : collisions) { - if (!isGoodEvent(collision)) { - continue; - } - if (maxNcontributors < collision.numContrib()) { - maxNcontributors = collision.numContrib(); - bestCollIndex = collision.globalIndex(); - crec = getRecoCent(collision); - } - } - - registry.fill(HIST("AmbTracks/hVtxzMCrec"), mcCollision.posZ()); - + float cGen = -1; + if constexpr (has_reco_cent) { + float crecMin = 105.f; for (const auto& collision : collisions) { - if (!isGoodEvent(collision)) { - continue; - } - // Select collisions with the largest number of contributors - if (gConf.cfgRemoveSplitVertex && (bestCollIndex != collision.globalIndex())) { - continue; + if (isGoodEvent(collision)) { + float c = getRecoCent(collision); + if (c < crecMin) { + crecMin = c; + } } - registry.fill(HIST("Events/Centrality/ReEffStatus"), 1, crec); - if (!collision.has_mcCollision()) { - continue; + } + if (cGen < 0) + cGen = crecMin; + } + float occGen = -1.; + for (const auto& collision : collisions) { + if (isGoodEvent(collision)) { + float o = getOccupancy(collision, eventCuts.occupancyEstimator); + if (o > occGen) { + occGen = o; } + } + } - std::array dcaInfOrig; - std::array dcaInfo; - double bestDCA[2]; - auto trkPerColl = tracks.sliceBy(compCollPerCol, collision.globalIndex()); - - for (auto const& track : trkPerColl) { - dcaInfOrig[0] = 999.f; // original DCAx from propagation - dcaInfOrig[1] = 999.f; // original DCAy from propagation - dcaInfOrig[2] = 999.f; // original DCAz from propagation - dcaInfo[0] = 999.f; // calcualted DCAxy - dcaInfo[1] = 999.f; // calculated DCAz - same as original - bestDCA[0] = 999.f; // minimal DCAxy - bestDCA[1] = 999.f; // minimal DCAz - - if (!isTrackSelected(track)) { - continue; - } - - auto bestCol = track.has_collision() ? track.collisionId() : -1; - uint index = uint(track.collisionId() >= 0); - auto ids = track.compatibleCollIds(); - bool isAmbiguous = (ids.size() > 1); - - if (gConf.cfgRemoveReassigned) { - if (ids.empty() || (ids.size() == 1 && bestCol == ids[0])) { - continue; - } - } - if (gConf.cfgRemoveOrphanTracks && ids.empty()) { - continue; - } - if (!track.has_mcParticle()) { - continue; - } - auto particle = track.mcParticle_as(); - if (!isChrgParticle(particle.pdgCode())) { - continue; - } - if (particle.eta() <= trackCuts.minEta || particle.eta() >= trackCuts.maxEta) { - continue; - } - if (gConf.cfgUseParticleSel && !isParticleSelected(particle)) { - continue; - } - int bestMCCol = -1; - o2::track::TrackParCovFwd trackPar = o2::aod::fwdtrackutils::getTrackParCovFwdShift(track, mZShift); - - if (index) { - auto mcCollision = particle.mcCollision_as(); - if (eventCuts.useZDiffCut) { - if (std::abs(collision.posZ() - mcCollision.posZ()) > eventCuts.maxZvtxDiff) { - continue; - } - } - - if (isAmbiguous) { - for (const auto& collIdx : track.compatibleCollIds()) { - auto ambColl = collisions.rawIteratorAt(collIdx); - if (!ambColl.has_mcCollision()) { - continue; - } - - trackPar.propagateToDCAhelix(bZ, {ambColl.posX(), ambColl.posY(), ambColl.posZ()}, dcaInfOrig); - - if (gConf.cfgDCAtype == 0) { - dcaInfo[0] = dcaInfOrig[0]; - } else if (gConf.cfgDCAtype == CintOne) { - dcaInfo[0] = dcaInfOrig[1]; - } else if (gConf.cfgDCAtype == CintTwo) { - dcaInfo[0] = std::sqrt(dcaInfOrig[0] * dcaInfOrig[0] + dcaInfOrig[1] * dcaInfOrig[1]); - } - dcaInfo[1] = dcaInfOrig[2]; - - if ((std::abs(dcaInfo[0]) < std::abs(bestDCA[0])) && (std::abs(dcaInfo[1]) < std::abs(bestDCA[1]))) { - bestCol = ambColl.globalIndex(); - bestMCCol = ambColl.mcCollisionId(); - bestDCA[0] = dcaInfo[0]; - bestDCA[1] = dcaInfo[1]; - } - - // LOGP(info, "-> track {}: {}", track.globalIndex(), dcaInfo[0]); - registry.fill(HIST("AmbTracks/DCAXY"), dcaInfo[0]); - registry.fill(HIST("AmbTracks/DCAZ"), dcaInfo[1]); - } - - registry.fill(HIST("AmbTracks/DCAXYBest"), bestDCA[0]); - registry.fill(HIST("AmbTracks/DCAZBest"), bestDCA[1]); - registry.fill(HIST("AmbTracks/Centrality/THnDCAxyBestGen"), particle.pt(), particle.eta(), mcCollision.posZ(), bestDCA[0], bestDCA[1], crec); - registry.fill(HIST("AmbTracks/BestGenDxyz"), collision.posX() - mcCollision.posX(), collision.posY() - mcCollision.posY(), collision.posZ() - mcCollision.posZ(), bestDCA[0], bestDCA[1]); + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/EvtGenRecReassoc"), 1., cGen, occGen); + } else { + registry.fill(HIST("Events/EvtGenRecReassoc"), 1., occGen); + } - if (particle.isPhysicalPrimary()) { - registry.fill(HIST("AmbTracks/DCAXYBestPrim"), bestDCA[0]); - registry.fill(HIST("AmbTracks/DCAZBestPrim"), bestDCA[1]); - registry.fill(HIST("AmbTracks/Centrality/THnDCAxyBestGenPrim"), particle.pt(), particle.eta(), mcCollision.posZ(), bestDCA[0], bestDCA[1], crec); - registry.fill(HIST("AmbTracks/BestPrimDxyz"), collision.posX() - mcCollision.posX(), collision.posY() - mcCollision.posY(), collision.posZ() - mcCollision.posZ(), bestDCA[0], bestDCA[1]); - } + for (const auto& collision : collisions) { + auto crec = getRecoCent(collision); + auto occrec = getOccupancy(collision, eventCuts.occupancyEstimator); - auto mcCollID = particle.mcCollisionId(); - registry.fill(HIST("Events/Centrality/ReEffStatus"), 2, crec); - - if (!track.has_collision()) { - registry.fill(HIST("Events/Centrality/ReEffStatus"), 4, crec); - if (bestMCCol == mcCollID) // correctly assigned to bestCol - { - registry.fill(HIST("Events/Centrality/ReEffStatus"), 6, crec); - registry.fill(HIST("AmbTracks/DCAXYBestTrue"), bestDCA[0]); - registry.fill(HIST("AmbTracks/DCAZBestTrue"), bestDCA[1]); - registry.fill(HIST("AmbTracks/Centrality/THnDCAxyBestTrue"), particle.pt(), particle.eta(), mcCollision.posZ(), bestDCA[0], bestDCA[1], crec); - registry.fill(HIST("AmbTracks/BestTrueDxyz"), collision.posX() - mcCollision.posX(), collision.posY() - mcCollision.posY(), collision.posZ() - mcCollision.posZ(), bestDCA[0], bestDCA[1]); - } else { - registry.fill(HIST("AmbTracks/DCAXYBestFalse"), bestDCA[0]); - registry.fill(HIST("AmbTracks/DCAZBestFalse"), bestDCA[1]); - registry.fill(HIST("AmbTracks/Centrality/THnDCAxyBestFalse"), particle.pt(), particle.eta(), mcCollision.posZ(), bestDCA[0], bestDCA[1], crec); - registry.fill(HIST("AmbTracks/BestFalseDxyz"), collision.posX() - mcCollision.posX(), collision.posY() - mcCollision.posY(), collision.posZ() - mcCollision.posZ(), bestDCA[0], bestDCA[1]); - } - } else if (track.collisionId() != bestCol) { // reassgined - auto collOrig = collisions.rawIteratorAt(track.collisionId()); - registry.fill(HIST("Events/Centrality/ReEffStatus"), 3, crec); - if (bestMCCol == mcCollID) // correctly reassigned - { - registry.fill(HIST("Events/Centrality/ReEffStatus"), 6, crec); - registry.fill(HIST("AmbTracks/DCAXYBestTrue"), bestDCA[0]); - registry.fill(HIST("AmbTracks/DCAZBestTrue"), bestDCA[1]); - registry.fill(HIST("AmbTracks/Centrality/THnDCAxyBestTrue"), particle.pt(), particle.eta(), mcCollision.posZ(), bestDCA[0], bestDCA[1], crec); - registry.fill(HIST("AmbTracks/BestTrueDxyz"), collision.posX() - mcCollision.posX(), collision.posY() - mcCollision.posY(), collision.posZ() - mcCollision.posZ(), bestDCA[0], bestDCA[1]); - } else { // uncorrectly reassigned - registry.fill(HIST("AmbTracks/DCAXYBestFalse"), bestDCA[0]); - registry.fill(HIST("AmbTracks/DCAZBestFalse"), bestDCA[1]); - registry.fill(HIST("AmbTracks/Centrality/THnDCAxyBestFalse"), particle.pt(), particle.eta(), mcCollision.posZ(), bestDCA[0], bestDCA[1], crec); - registry.fill(HIST("AmbTracks/BestFalseDxyz"), collision.posX() - mcCollision.posX(), collision.posY() - mcCollision.posY(), collision.posZ() - mcCollision.posZ(), bestDCA[0], bestDCA[1]); - } - if (collOrig.mcCollisionId() == mcCollID) { // initially correctly assigned - registry.fill(HIST("Events/Centrality/ReEffStatus"), 5, crec); - registry.fill(HIST("AmbTracks/DCAXYBestTrueOrigReAssoc"), bestDCA[0]); - registry.fill(HIST("AmbTracks/DCAZBestTrueOrigReAssoc"), bestDCA[1]); - registry.fill(HIST("AmbTracks/Centrality/THnDCAxyBestTrueOrigReAssoc"), particle.pt(), particle.eta(), mcCollision.posZ(), bestDCA[0], bestDCA[1], crec); - registry.fill(HIST("AmbTracks/BestTrueOrigReAssocDxyz"), collision.posX() - mcCollision.posX(), collision.posY() - mcCollision.posY(), collision.posZ() - mcCollision.posZ(), bestDCA[0], bestDCA[1]); - } - } else { // not reassigned - the track has a collision and track.collisionId() == bestCol - if (track.collisionId() != bestCol) { - registry.fill(HIST("Events/Centrality/ReEffStatus"), 7, crec); - // LOGP(info, "-> track id {}: bestCollid {}", track.collisionId(), bestCol); - } - registry.fill(HIST("Events/Centrality/ReEffStatus"), 8, crec); - if (bestMCCol == mcCollID) // correctly assigned - { - registry.fill(HIST("Events/Centrality/ReEffStatus"), 9, crec); - registry.fill(HIST("AmbTracks/DCAXYBestTrueOrigAssoc"), bestDCA[0]); - registry.fill(HIST("AmbTracks/DCAZBestTrueOrigAssoc"), bestDCA[1]); - registry.fill(HIST("AmbTracks/Centrality/THnDCAxyBestTrueOrigAssoc"), particle.pt(), particle.eta(), mcCollision.posZ(), bestDCA[0], bestDCA[1], crec); - registry.fill(HIST("AmbTracks/BestTrueOrigAssocDxyz"), collision.posX() - mcCollision.posX(), collision.posY() - mcCollision.posY(), collision.posZ() - mcCollision.posZ(), bestDCA[0], bestDCA[1]); - } - } - } - } - } + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/EvtGenRecReassoc"), 2., crec, occrec); + } else { + registry.fill(HIST("Events/EvtGenRecReassoc"), 2., occrec); } - } - } - PROCESS_SWITCH(DndetaMFTPbPb, processReassocEfficiency, "Process collision-reassociation efficiency based on track propagation DCA 3D (in FT0C centrality bins)", false); + if (!isGoodEvent(collision)) { + continue; + } - Preslice mftTrkCompCollperCol = o2::aod::fwdtrack::collisionId; + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/EvtGenRecReassoc"), 3., crec, occrec); + } else { + registry.fill(HIST("Events/EvtGenRecReassoc"), 3., occrec); + } - /// @brief process template function for DCA MC checks - template - void processSecondariesMC(typename soa::Join const& collisions, - MftTracksWCollsMC const& tracks, - MC const& mcCollisions, - aod::McParticles const& particles, - ExtBCs const& bcs) - { - registry.fill(HIST("Events/hNGenRecColls"), 1.f, collisions.size()); - registry.fill(HIST("Events/hNGenRecColls"), 2.f, mcCollisions.size()); + if (gConf.cfgRemoveSplitVertex && (collision.globalIndex() != mcCollision.bestCollisionIndex())) { + continue; + } - if (bcs.size() == 0) { - return; - } - auto bc = bcs.begin(); - initCCDB(bc); + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/EvtGenRecReassoc"), 4., crec, occrec); + } else { + registry.fill(HIST("Events/EvtGenRecReassoc"), 4., occrec); + } - // Generated evets with >= 1 reco collisions - const auto& nRecoColls = collisions.size(); - if (nRecoColls > CintZero) { - auto maxNcontributors = -1; - auto bestCollIndex = -1; - auto crec = -1; - for (auto const& collision : collisions) { - if (!isGoodEvent(collision)) { + auto perCollisionASample = besttracks.sliceBy(perColBestTrks, collision.globalIndex()); + for (auto const& atrack : perCollisionASample) { + if (!isBestTrackSelected(atrack)) { continue; } - if (maxNcontributors < collision.numContrib()) { - maxNcontributors = collision.numContrib(); - bestCollIndex = collision.globalIndex(); - if constexpr (has_reco_cent) { - crec = getRecoCent(collision); - } - } - } + auto itrack = atrack.template mfttrack_as(); - for (const auto& collision : collisions) { - if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Events/Centrality/hTrackToCollEvtType"), static_cast(TrackToCollEvtType::kAllRecColl), crec); - } else { - qaregistry.fill(HIST("Events/hTrackToCollEvtType"), static_cast(TrackToCollEvtType::kAllRecColl)); - } - // At least one generated primary in MFT acceptance + TVX triggered collisions - if (gConf.cfgUseInelgt0wMFT && !isInelGt0wMft(particles)) { - return; - } - if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Events/Centrality/hTrackToCollEvtType"), static_cast(TrackToCollEvtType::kIsInelGt0wMft), crec); - } else { - qaregistry.fill(HIST("Events/hTrackToCollEvtType"), static_cast(TrackToCollEvtType::kIsInelGt0wMft)); - } - if (!isGoodEvent(collision)) { + if (!isTrackSelected(itrack)) { continue; } - if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Events/Centrality/hTrackToCollEvtType"), static_cast(TrackToCollEvtType::kEvtSel), crec); - } else { - qaregistry.fill(HIST("Events/hTrackToCollEvtType"), static_cast(TrackToCollEvtType::kEvtSel)); - } - // Select collisions with the largest number of contributors - if (gConf.cfgRemoveSplitVertex && (bestCollIndex != collision.globalIndex())) { + if (!itrack.has_collision()) { continue; } - if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Events/Centrality/hTrackToCollEvtType"), static_cast(TrackToCollEvtType::kBestCollIdx), crec); - } else { - qaregistry.fill(HIST("Events/hTrackToCollEvtType"), static_cast(TrackToCollEvtType::kBestCollIdx)); - } - if (!collision.has_mcCollision()) { - continue; + if (gConf.cfgRemoveReassigned) { + if (itrack.collisionId() != atrack.bestCollisionId()) { + continue; + } } + if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Events/Centrality/hTrackToCollEvtType"), static_cast(TrackToCollEvtType::kIsMcColl), crec); + registry.fill(HIST("Tracks/Centrality/THnDCAxyBestRec"), itrack.pt(), itrack.eta(), collision.posZ(), atrack.bestDCAXY(), atrack.bestDCAZ(), crec, occrec); } else { - qaregistry.fill(HIST("Events/hTrackToCollEvtType"), static_cast(TrackToCollEvtType::kIsMcColl)); + registry.fill(HIST("Tracks/THnDCAxyBestRec"), itrack.pt(), itrack.eta(), collision.posZ(), atrack.bestDCAXY(), atrack.bestDCAZ()); } - auto trkPerColl = tracks.sliceBy(mftTrkCompCollperCol, collision.globalIndex()); - for (auto const& track : trkPerColl) { - if (!isTrackSelected(track)) { + if (itrack.has_mcParticle() && itrack.mcMask() == trackCuts.selMcMask) { + // auto particle = itrack.template mcParticle_as(); + auto particle = itrack.template mcParticle_as(); + if (!isChrgParticle(particle.pdgCode())) { continue; } - if (!track.has_collision()) { + if (gConf.cfgUseParticleSel && !isParticleSelected(particle)) { continue; } - auto trkCollId = track.has_collision() ? track.collisionId() : -1; - auto ids = track.compatibleCollIds(); - bool isAmbiguous = (ids.size() > 1); - if constexpr (has_reco_cent) { - qaregistry.fill(HIST("TrkCompColls/Centrality/hAmbTrackType"), static_cast(AmbTrkType::kAll), crec); - } else { - qaregistry.fill(HIST("TrkCompColls/hAmbTrackType"), static_cast(AmbTrkType::kAll)); - } - if (ids.empty()) { - if constexpr (has_reco_cent) { - qaregistry.fill(HIST("TrkCompColls/Centrality/hAmbTrackType"), static_cast(AmbTrkType::kOrphan), crec); - } else { - qaregistry.fill(HIST("TrkCompColls/hAmbTrackType"), static_cast(AmbTrkType::kOrphan)); + const auto dcaXtruth(particle.vx() - mcCollision.posX()); + const auto dcaYtruth(particle.vy() - mcCollision.posY()); + const auto dcaZtruth(particle.vz() - mcCollision.posZ()); + auto dcaXYtruth = std::sqrt(dcaXtruth * dcaXtruth + dcaYtruth * dcaYtruth); + + if (eventCuts.useZDiffCut) { + if (std::abs(collision.posZ() - mcCollision.posZ()) > eventCuts.maxZvtxDiff) { + continue; } } - if (ids.size() > 0) { - if (ids.size() == 1) { - if (trkCollId == ids[0]) { - if constexpr (has_reco_cent) { - qaregistry.fill(HIST("TrkCompColls/Centrality/hAmbTrackType"), static_cast(AmbTrkType::kNonAmb), crec); - } else { - qaregistry.fill(HIST("TrkCompColls/hAmbTrackType"), static_cast(AmbTrkType::kNonAmb)); - } - } else if (trkCollId != ids[0]) { + + if (collision.has_mcCollision() && collision.mcCollisionId() == particle.mcCollisionId()) { + if (!particle.isPhysicalPrimary()) { // Secondaries (weak decays and material) + if constexpr (has_reco_cent) { + registry.fill(HIST("Tracks/Centrality/THnDCAxyBestGenSec"), particle.pt(), particle.eta(), mcCollision.posZ(), atrack.bestDCAXY(), atrack.bestDCAZ(), crec, occrec); + registry.fill(HIST("Tracks/Centrality/THnDCAxyBestGenTruthSec"), particle.pt(), particle.eta(), mcCollision.posZ(), dcaXYtruth, dcaZtruth, crec, occrec); + } else { + registry.fill(HIST("Tracks/THnDCAxyBestGenSec"), particle.pt(), particle.eta(), mcCollision.posZ(), atrack.bestDCAXY(), atrack.bestDCAZ()); + registry.fill(HIST("Tracks/THnDCAxyBestGenTruthSec"), particle.pt(), particle.eta(), mcCollision.posZ(), dcaXYtruth, dcaZtruth); + } + if (particle.getProcess() == TMCProcess::kPDecay) { // Particles from decay if constexpr (has_reco_cent) { - qaregistry.fill(HIST("TrkCompColls/Centrality/hAmbTrackType"), static_cast(AmbTrkType::kAmb), crec); + registry.fill(HIST("Tracks/Centrality/THnDCAxyBestGenSecWeak"), particle.pt(), particle.eta(), mcCollision.posZ(), atrack.bestDCAXY(), atrack.bestDCAZ(), crec, occrec); } else { - qaregistry.fill(HIST("TrkCompColls/hAmbTrackType"), static_cast(AmbTrkType::kAmb)); + registry.fill(HIST("Tracks/THnDCAxyBestGenSecWeak"), particle.pt(), particle.eta(), mcCollision.posZ(), atrack.bestDCAXY(), atrack.bestDCAZ()); } - } else { + } else { // Particles from the material if constexpr (has_reco_cent) { - qaregistry.fill(HIST("TrkCompColls/Centrality/hAmbTrackType"), static_cast(AmbTrkType::kNonAmbSame), crec); + registry.fill(HIST("Tracks/Centrality/THnDCAxyBestGenSecMat"), particle.pt(), particle.eta(), mcCollision.posZ(), atrack.bestDCAXY(), atrack.bestDCAZ(), crec, occrec); } else { - qaregistry.fill(HIST("TrkCompColls/hAmbTrackType"), static_cast(AmbTrkType::kNonAmbSame)); + registry.fill(HIST("Tracks/THnDCAxyBestGenSecMat"), particle.pt(), particle.eta(), mcCollision.posZ(), atrack.bestDCAXY(), atrack.bestDCAZ()); } } - } else { + } else { // Primaries if constexpr (has_reco_cent) { - qaregistry.fill(HIST("TrkCompColls/Centrality/hAmbTrackType"), static_cast(AmbTrkType::kAmbGt1), crec); + registry.fill(HIST("Tracks/Centrality/THnDCAxyBestGenPrim"), particle.pt(), particle.eta(), mcCollision.posZ(), atrack.bestDCAXY(), atrack.bestDCAZ(), crec, occrec); + registry.fill(HIST("Tracks/Centrality/THnDCAxyBestGenTruthPrim"), particle.pt(), particle.eta(), mcCollision.posZ(), dcaXYtruth, dcaZtruth, crec, occrec); } else { - qaregistry.fill(HIST("TrkCompColls/hAmbTrackType"), static_cast(AmbTrkType::kAmbGt1)); + registry.fill(HIST("Tracks/THnDCAxyBestGenPrim"), particle.pt(), particle.eta(), mcCollision.posZ(), atrack.bestDCAXY(), atrack.bestDCAZ()); + registry.fill(HIST("Tracks/THnDCAxyBestGenTruthPrim"), particle.pt(), particle.eta(), mcCollision.posZ(), dcaXYtruth, dcaZtruth); } } - } else { - if constexpr (has_reco_cent) { - qaregistry.fill(HIST("TrkCompColls/Centrality/hAmbTrackType"), static_cast(AmbTrkType::kOrphanNull), crec); - } else { - qaregistry.fill(HIST("TrkCompColls/hAmbTrackType"), static_cast(AmbTrkType::kOrphanNull)); - } - } - - if (gConf.cfgRemoveTrivialAssoc) { - if (ids.empty() || (ids.size() == 1 && trkCollId == ids[0])) { - qaregistry.fill(HIST("TrkCompColls/Centrality/histNonAmbTrackNumColls"), ids.size()); - continue; - } - } - - if (isAmbiguous) { - if constexpr (has_reco_cent) { - registry.fill(HIST("Tracks/Centrality/THnRecAmb"), track.pt(), track.eta(), collision.posZ(), crec); - } else { - registry.fill(HIST("Tracks/THnRecAmb"), track.pt(), track.eta(), collision.posZ()); - } - } else { - if constexpr (has_reco_cent) { - registry.fill(HIST("Tracks/Centrality/THnRec"), track.pt(), track.eta(), collision.posZ(), crec); - } else { - registry.fill(HIST("Tracks/THnRec"), track.pt(), track.eta(), collision.posZ()); - } - if (trkCollId == ids[0]) { + } else { // Wrong collision + if (!particle.isPhysicalPrimary()) { // Secondaries (weak decays and material) if constexpr (has_reco_cent) { - registry.fill(HIST("Tracks/Centrality/THnRecNonAmb"), track.pt(), track.eta(), collision.posZ(), crec); + registry.fill(HIST("Tracks/Centrality/THnDCAxyBestGenSecWrongColl"), particle.pt(), particle.eta(), mcCollision.posZ(), atrack.bestDCAXY(), atrack.bestDCAZ(), crec, occrec); + registry.fill(HIST("Tracks/Centrality/THnDCAxyBestGenTruthSecWrongColl"), particle.pt(), particle.eta(), mcCollision.posZ(), dcaXYtruth, dcaZtruth, crec, occrec); } else { - registry.fill(HIST("Tracks/THnRecNonAmb"), track.pt(), track.eta(), collision.posZ()); + registry.fill(HIST("Tracks/THnDCAxyBestGenSecWrongColl"), particle.pt(), particle.eta(), mcCollision.posZ(), atrack.bestDCAXY(), atrack.bestDCAZ()); + registry.fill(HIST("Tracks/THnDCAxyBestGenTruthSecWrongColl"), particle.pt(), particle.eta(), mcCollision.posZ(), dcaXYtruth, dcaZtruth); } - } - if (trkCollId != ids[0]) { + } else { // Primaries if constexpr (has_reco_cent) { - registry.fill(HIST("Tracks/Centrality/THnRecAmbRest"), track.pt(), track.eta(), collision.posZ(), crec); + registry.fill(HIST("Tracks/Centrality/THnDCAxyBestGenPrimWrongColl"), particle.pt(), particle.eta(), mcCollision.posZ(), atrack.bestDCAXY(), atrack.bestDCAZ(), crec, occrec); + registry.fill(HIST("Tracks/Centrality/THnDCAxyBestGenTruthPrimWrongColl"), particle.pt(), particle.eta(), mcCollision.posZ(), dcaXYtruth, dcaZtruth, crec, occrec); } else { - registry.fill(HIST("Tracks/THnRecAmbRest"), track.pt(), track.eta(), collision.posZ()); + registry.fill(HIST("Tracks/THnDCAxyBestGenPrimWrongColl"), particle.pt(), particle.eta(), mcCollision.posZ(), atrack.bestDCAXY(), atrack.bestDCAZ()); + registry.fill(HIST("Tracks/THnDCAxyBestGenTruthPrimWrongColl"), particle.pt(), particle.eta(), mcCollision.posZ(), dcaXYtruth, dcaZtruth); } } } - - // remove orphan tracks - if (ids.empty()) { - continue; - } - // remove fake tracks - if (!track.has_mcParticle() || track.mcMask() != 0) { - continue; - } - // assigned collision index - uint index = uint(track.collisionId() >= 0); - auto particle = track.template mcParticle_as(); - if (!isChrgParticle(particle.pdgCode())) { - continue; - } - if (particle.eta() <= trackCuts.minEta || particle.eta() >= trackCuts.maxEta) { - continue; - } - if (gConf.cfgUseParticleSel && !isParticleSelected(particle)) { - continue; - } - - if (index) { - auto mcCollision = particle.template mcCollision_as(); - if (eventCuts.useZVtxCutMC && (std::abs(mcCollision.posZ()) >= eventCuts.maxZvtx)) { - continue; - } - if (eventCuts.useZDiffCut) { - if (std::abs(collision.posZ() - mcCollision.posZ()) > eventCuts.maxZvtxDiff) { - continue; - } - } - - if (collision.has_mcCollision() && collision.mcCollisionId() == particle.mcCollisionId()) { - if (!particle.isPhysicalPrimary()) { // Secondaries (weak decays and material) - if constexpr (has_reco_cent) { - registry.fill(HIST("Tracks/Centrality/THnGenSec"), particle.pt(), particle.eta(), particle.mcCollision().posZ(), crec); - } else { - registry.fill(HIST("Tracks/THnGenSec"), particle.pt(), particle.eta(), particle.mcCollision().posZ()); - } - if (particle.getProcess() == TMCProcess::kPDecay) { // Particles from decay - if constexpr (has_reco_cent) { - registry.fill(HIST("Tracks/Centrality/THnGenSecWeak"), particle.pt(), particle.eta(), particle.mcCollision().posZ(), crec); - } else { - registry.fill(HIST("Tracks/THnGenSecWeak"), particle.pt(), particle.eta(), particle.mcCollision().posZ()); - } - } else { // Particles from the material - if constexpr (has_reco_cent) { - registry.fill(HIST("Tracks/Centrality/THnGenSecMat"), particle.pt(), particle.eta(), particle.mcCollision().posZ(), crec); - } else { - registry.fill(HIST("Tracks/THnGenSecMat"), particle.pt(), particle.eta(), particle.mcCollision().posZ()); - } - } - } else { // Primaries - if constexpr (has_reco_cent) { - registry.fill(HIST("Tracks/Centrality/THnGenPrim"), particle.pt(), particle.eta(), particle.mcCollision().posZ(), crec); - } else { - registry.fill(HIST("Tracks/THnGenPrim"), particle.pt(), particle.eta(), particle.mcCollision().posZ()); - } - } - } else { - if (isAmbiguous) { - for (const auto& collIdx : track.compatibleCollIds()) { - auto ambColl = collisions.rawIteratorAt(collIdx); - if (ambColl.has_mcCollision() && ambColl.mcCollisionId() == particle.mcCollisionId()) { - if (!particle.isPhysicalPrimary()) { // Secondaries (weak decays and material) - if constexpr (has_reco_cent) { - registry.fill(HIST("Tracks/Centrality/THnGenSecAmb"), particle.pt(), particle.eta(), particle.mcCollision().posZ(), crec); - } else { - registry.fill(HIST("Tracks/THnGenSecAmb"), particle.pt(), particle.eta(), particle.mcCollision().posZ()); - } - if (particle.getProcess() == TMCProcess::kPDecay) { // Particles from decay - if constexpr (has_reco_cent) { - registry.fill(HIST("Tracks/Centrality/THnGenSecWeakAmb"), particle.pt(), particle.eta(), particle.mcCollision().posZ(), crec); - } else { - registry.fill(HIST("Tracks/THnGenSecWeakAmb"), particle.pt(), particle.eta(), particle.mcCollision().posZ()); - } - } else { // Particles from the material - if constexpr (has_reco_cent) { - registry.fill(HIST("Tracks/Centrality/THnGenSecMatAmb"), particle.pt(), particle.eta(), particle.mcCollision().posZ(), crec); - } else { - registry.fill(HIST("Tracks/THnGenSecMatAmb"), particle.pt(), particle.eta(), particle.mcCollision().posZ()); - } - } - } else { // Primaries - if constexpr (has_reco_cent) { - registry.fill(HIST("Tracks/Centrality/THnGenPrimAmb"), particle.pt(), particle.eta(), particle.mcCollision().posZ(), crec); - } else { - registry.fill(HIST("Tracks/THnGenPrimAmb"), particle.pt(), particle.eta(), particle.mcCollision().posZ()); - } - } - break; - } - } - } - } + } else { + LOGP(debug, "No MC particle for ambiguous itrack, skip..."); + if constexpr (has_reco_cent) { + registry.fill(HIST("Tracks/Centrality/THnDCAxyBestRecFake"), itrack.pt(), itrack.eta(), collision.posZ(), atrack.bestDCAXY(), atrack.bestDCAZ(), crec, occrec); + } else { + registry.fill(HIST("Tracks/THnDCAxyBestRecFake"), itrack.pt(), itrack.eta(), collision.posZ(), atrack.bestDCAXY(), atrack.bestDCAZ()); } } } } } - void processSecondariesMCInlcusive(soa::Join const& collisions, - MftTracksWCollsMC const& tracks, - aod::McCollisions const& mccollisions, - aod::McParticles const& particles, - ExtBCs const& bcs) + void processDCAReassocMcInclusive( + CollsMCExtra::iterator const& mccollision, + soa::SmallGroups> const& collisions, + aod::McParticles const& particles, + BestTracksMC const& besttracks, + MFTTracksLabeled const& tracks) { - processSecondariesMC(collisions, tracks, mccollisions, particles, bcs); + processDCAReassocMc(mccollision, collisions, particles, besttracks, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processSecondariesMCInlcusive, "Process secondaries checks (Inclusive)", false); + PROCESS_SWITCH(DndetaMFTPbPb, processDCAReassocMcInclusive, "Process MC DCA checks using re-association information based on BestCollisionsFwd3d table (Inclusive)", false); - void processSecondariesMCCentFT0C(soa::Join const& collisions, - MftTracksWCollsMC const& tracks, - aod::McCollisions const& mccollisions, - aod::McParticles const& particles, - ExtBCs const& bcs) + void processDCAReassocMcCentFT0C( + CollsMCExtra::iterator const& mccollision, + soa::SmallGroups> const& collisions, + aod::McParticles const& particles, + BestTracksMC const& besttracks, + MFTTracksLabeled const& tracks) { - processSecondariesMC(collisions, tracks, mccollisions, particles, bcs); + processDCAReassocMc(mccollision, collisions, particles, besttracks, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processSecondariesMCCentFT0C, "Process secondaries checks (in FT0C centrality bins)", false); + PROCESS_SWITCH(DndetaMFTPbPb, processDCAReassocMcCentFT0C, "Process MC DCA checks using re-association information based on BestCollisionsFwd3d table (in FT0C centrality bins)", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)