diff --git a/PWGLF/Tasks/Nuspex/dedxPidAnalysis.cxx b/PWGLF/Tasks/Nuspex/dedxPidAnalysis.cxx index 3181a09495d..789a373106e 100644 --- a/PWGLF/Tasks/Nuspex/dedxPidAnalysis.cxx +++ b/PWGLF/Tasks/Nuspex/dedxPidAnalysis.cxx @@ -43,12 +43,14 @@ #include #include +#include #include #include #include #include #include +#include #include #include @@ -65,33 +67,31 @@ using SelectedCollisions = soa::Join; using BCsRun3 = soa::Join; -static constexpr int NCentHists{10}; -std::array, NCentHists> hDedxVsMomentumVsCentPos{}; -std::array, NCentHists> hDedxVsMomentumVsCentNeg{}; -std::array, NCentHists + 1> hDedxVspTMomentumVsCent{}; -std::array, NCentHists + 1> hMomentumVsEtaPos{}; -std::array, NCentHists + 1> hMomentumVsEtaNeg{}; -std::array, NCentHists + 1> hpTVsEtaPos{}; -std::array, NCentHists + 1> hpTVsEtaNeg{}; - struct DedxPidAnalysis { // dE/dx for all charged particles - HistogramRegistry registryDeDx{ - "registryDeDx", - {}, - OutputObjHandlingPolicy::AnalysisObject, - true, - true}; + HistogramRegistry registryDeDx{"registryDeDx", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; // Constant values static constexpr int EtaIntervals = 8; static constexpr int ParticlesType = 4; static constexpr int CentralityClasses = 10; - float pionMin = 0.35; - float pionMax = 0.45; - float elTofCut = 0.1; - float pionTofCut = 1.0; - float pTcut = 2.0; + std::array, CentralityClasses> hDedxVsMomentumVsCentPos{}; + std::array, CentralityClasses> hDedxVsMomentumVsCentNeg{}; + std::array, ParticlesType> hDedxvsMomentumPos{}; + std::array, ParticlesType> hDedxvsMomentumNeg{}; + std::array, CentralityClasses + 1> hDedxVspTMomentumVsCent{}; + std::array, CentralityClasses + 1> hMomentumVsEtaPos{}; + std::array, CentralityClasses + 1> hMomentumVsEtaNeg{}; + std::array, CentralityClasses + 1> hpTVsEtaPos{}; + std::array, CentralityClasses + 1> hpTVsEtaNeg{}; + std::array, EtaIntervals> hNclFoundTPCPosBefore; + std::array, EtaIntervals> hNclFoundTPCNegBefore; + std::array, EtaIntervals> hNclFoundTPCPosAfter; + std::array, EtaIntervals> hNclFoundTPCNegAfter; + std::array, EtaIntervals> hNclPIDTPCPosBefore; + std::array, EtaIntervals> hNclPIDTPCNegBefore; + std::array, EtaIntervals> hNclPIDTPCPosAfter; + std::array, EtaIntervals> hNclPIDTPCNegAfter; bool fillHist = false; @@ -116,6 +116,12 @@ struct DedxPidAnalysis { }; + enum V0SigmaMode { + V0NoSigmaCut = 0, + V0SigmaOnly = 1, + V0TOFAndSigma = 2 + }; + enum NINELSelectionMode : int { NoSelINEL = 1, SelINELgt0 = 2, @@ -203,9 +209,17 @@ struct DedxPidAnalysis { Configurable nSigmaDCAxy{"nSigmaDCAxy", 3.0, "nSigma DCAxy selection"}; Configurable dcaXYp0{"dcaXYp0", 0.0105f, "DCAxy formula: p0 + p1/pt^p2"}; Configurable dcaXYp1{"dcaXYp1", 0.0350f, "DCAxy p1 parameter"}; - Configurable dcaXYp2{"dcaXYp2", 1.1f, "DCA_xy p2 parameter"}; + Configurable dcaXYp2{"dcaXYp2", 1.1f, "DCAxy p2 parameter"}; + Configurable dcaZp0{"dcaZp0", 0.0105f, "DCAz formula: p0 + p1/pt^p2"}; + Configurable dcaZp1{"dcaZp1", 0.0350f, "DCAz p1 parameter"}; + Configurable dcaZp2{"dcaZp2", 1.1f, "DCAz p2 parameter"}; Configurable nSigmaDCAz{"nSigmaDCAz", 3.0, "nSigma DCAz selection"}; - Configurable maxDCAz{"maxDCAz", 0.1f, "maxDCAz"}; + // Configurable maxDCAz{"maxDCAz", 0.1f, "maxDCAz"}; + Configurable pionMin{"pionMin", 0.35f, "pionMin"}; + Configurable pionMax{"pionMax", 0.45f, "pionMax"}; + Configurable elTofCut{"elTofCut", 0.1f, "elTofCut"}; + Configurable pionTofCut{"pionTofCut", 1.0f, "pionTofCut"}; + Configurable pTcut{"pTcut", 2.f, "pTcut"}; // v0 cuts Configurable v0cospaMin{"v0cospaMin", 0.999f, "Minimum V0 CosPA"}; Configurable minimumV0Radius{"minimumV0Radius", 1.2f, @@ -225,6 +239,7 @@ struct DedxPidAnalysis { Configurable v0ProperLifetimeCutLambda{"v0ProperLifetimeCutLambda", 30.f, "V0 proper lifetime cut for Lambda"}; Configurable nsigmaMax{"nsigmaMax", 3.0f, "Maximum nsigma cut"}; Configurable tpcMomentumCut{"tpcMomentumCut", 0.6f, "Momentum threshold above which TOF is required"}; + Configurable v0SigmaMode{"v0SigmaMode", 0, "0: no cut, 1: sigma only, 2: TOF + sigma above tpcMomentumCut"}; Configurable invMassCutK0s{"invMassCutK0s", 0.015f, "invariant Mass Cut for K0s"}; Configurable invMassCutLambda{"invMassCutLambda", 0.015f, "invariant Mass Cut for Lambda"}; Configurable invMassCutGamma{"invMassCutGamma", 0.015f, "invariant Mass Cut for Gamma"}; @@ -245,35 +260,16 @@ struct DedxPidAnalysis { Configurable highParam1{"highParam1", 0.16685, "First parameter for high phi cut"}; Configurable highParam2{"highParam2", 0.00981942, "Second parameter for high phi cut"}; Configurable armPodCut{"armPodCut", 5.0f, "pT * (cut) > |alpha|"}; - // Histograms names - static constexpr std::string_view DedxvsMomentumPos[ParticlesType] = {"dEdx_vs_Momentum_all_Pos", "dEdx_vs_Momentum_Pi_v0_Pos", "dEdx_vs_Momentum_Pr_v0_Pos", "dEdx_vs_Momentum_El_v0_Pos"}; - static constexpr std::string_view DedxvsMomentumNeg[ParticlesType] = {"dEdx_vs_Momentum_all_Neg", "dEdx_vs_Momentum_Pi_v0_Neg", "dEdx_vs_Momentum_Pr_v0_Neg", "dEdx_vs_Momentum_El_v0_Neg"}; - static constexpr std::string_view DedxvsMomentumvsCentPos[CentralityClasses] = {"dEdx_vs_Momentum_Cent0_1_Pos", "dEdx_vs_Momentum_Cent1_5_Pos", "dEdx_vs_Momentum_Cent5_10_Pos", "dEdx_vs_Momentum_Cent10_15_Pos", "dEdx_vs_Momentum_Cent15_20_Pos", "dEdx_vs_Momentum_Cent20_30_Pos", "dEdx_vs_Momentum_Cent30_40_Pos", "dEdx_vs_Momentum_Cent40_50_Pos", "dEdx_vs_Momentum_Cent50_70_Pos", "dEdx_vs_Momentum_Cent70_100_Pos"}; - static constexpr std::string_view DedxvsMomentumvsCentNeg[CentralityClasses] = {"dEdx_vs_Momentum_Cent0_1_Neg", "dEdx_vs_Momentum_Cent1_5_Neg", "dEdx_vs_Momentum_Cent5_10_Neg", "dEdx_vs_Momentum_Cent10_15_Neg", "dEdx_vs_Momentum_Cent15_20_Neg", "dEdx_vs_Momentum_Cent20_30_Neg", "dEdx_vs_Momentum_Cent30_40_Neg", "dEdx_vs_Momentum_Cent40_50_Neg", "dEdx_vs_Momentum_Cent50_70_Neg", "dEdx_vs_Momentum_Cent70_100_Neg"}; - static constexpr std::string_view DedxvspTMomentumvsCent[CentralityClasses + 1] = {"dEdx_vs_pTMomentum_Cent0_1", "dEdx_vs_pTMomentum_Cent1_5", "dEdx_vs_pTMomentum_Cent5_10", "dEdx_vs_pTMomentum_Cent10_15", "dEdx_vs_pTMomentum_Cent15_20", "dEdx_vs_pTMomentum_Cent20_30", "dEdx_vs_pTMomentum_Cent30_40", "dEdx_vs_pTMomentum_Cent40_50", "dEdx_vs_pTMomentum_Cent50_70", "dEdx_vs_pTMomentum_Cent70_100", "dEdx_vs_pTMomentum_all_Pos"}; - // Fine binning - static constexpr std::string_view CentpPos[CentralityClasses + 1] = {"p_vs_eta_Cent0_1_Pos", "p_vs_eta_Cent1_5_Pos", "p_vs_eta_Cent5_10_Pos", "p_vs_eta_Cent10_15_Pos", "p_vs_eta_Cent15_20_Pos", "p_vs_eta_Cent20_30_Pos", "p_vs_eta_Cent30_40_Pos", "p_vs_eta_Cent40_50_Pos", "p_vs_eta_Cent50_70_Pos", "p_vs_eta_Cent70_100_Pos", "p_vs_eta_MB_Pos"}; - static constexpr std::string_view CentpNeg[CentralityClasses + 1] = {"p_vs_eta_Cent0_1_Neg", "p_vs_eta_Cent1_5_Neg", "p_vs_eta_Cent5_10_Neg", "p_vs_eta_Cent10_15_Neg", "p_vs_eta_Cent15_20_Neg", "p_vs_eta_Cent20_30_Neg", "p_vs_eta_Cent30_40_Neg", "p_vs_eta_Cent40_50_Neg", "p_vs_eta_Cent50_70_Neg", "p_vs_eta_Cent70_100_Neg", "p_vs_eta_MB_Neg"}; - static constexpr std::string_view CentpTPos[CentralityClasses + 1] = {"pT_vs_eta_Cent0_1_Pos", "pT_vs_eta_Cent1_5_Pos", "pT_vs_eta_Cent5_10_Pos", "pT_vs_eta_Cent10_15_Pos", "pT_vs_eta_Cent15_20_Pos", "pT_vs_eta_Cent20_30_Pos", "pT_vs_eta_Cent30_40_Pos", "pT_vs_eta_Cent40_50_Pos", "pT_vs_eta_Cent50_70_Pos", "pT_vs_eta_Cent70_100_Pos", "pT_vs_eta_MB_Pos"}; - static constexpr std::string_view CentpTNeg[CentralityClasses + 1] = {"pT_vs_eta_Cent0_1_Neg", "pT_vs_eta_Cent1_5_Neg", "pT_vs_eta_Cent5_10_Neg", "pT_vs_eta_Cent10_15_Neg", "pT_vs_eta_Cent15_20_Neg", "pT_vs_eta_Cent20_30_Neg", "pT_vs_eta_Cent30_40_Neg", "pT_vs_eta_Cent40_50_Neg", "pT_vs_eta_Cent50_70_Neg", "pT_vs_eta_Cent70_100_Neg", "pT_vs_eta_MB_Neg"}; - // Ncl TPC - static constexpr std::string_view NclTPCDedxMomentumNegBefore[EtaIntervals] = {"Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_1_Before", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_2_Before", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_3_Before", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_4_Before", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_5_Before", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_6_Before", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_7_Before", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_8_Before"}; - static constexpr std::string_view NclTPCDedxMomentumPosBefore[EtaIntervals] = {"Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_1_Before", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_2_Before", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_3_Before", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_4_Before", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_5_Before", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_6_Before", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_7_Before", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_8_Before"}; - static constexpr std::string_view NclTPCDedxMomentumNegAfter[EtaIntervals] = {"Ncl_TFoundPC_vs_dEdx_vs_Momentum_Neg_1_After", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_2_After", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_3_After", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_4_After", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_5_After", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_6_After", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_7_After", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_8_After"}; - static constexpr std::string_view NclTPCDedxMomentumPosAfter[EtaIntervals] = {"Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_1_After", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_2_After", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_3_After", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_4_After", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_5_After", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_6_After", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_7_After", "Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_8_After"}; - // Ncl PID TPC - static constexpr std::string_view NclPIDTPCDedxMomentumNegBefore[EtaIntervals] = {"Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_1_Before", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_2_Before", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_3_Before", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_4_Before", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_5_Before", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_6_Before", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_7_Before", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_8_Before"}; - static constexpr std::string_view NclPIDTPCDedxMomentumPosBefore[EtaIntervals] = {"Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_1_Before", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_2_Before", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_3_Before", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_4_Before", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_5_Before", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_6_Before", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_7_Before", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_8_Before"}; - static constexpr std::string_view NclPIDTPCDedxMomentumNegAfter[EtaIntervals] = {"Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_1_After", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_2_After", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_3_After", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_4_After", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_5_After", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_6_After", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_7_After", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_8_After"}; - static constexpr std::string_view NclPIDTPCDedxMomentumPosAfter[EtaIntervals] = {"Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_1_After", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_2_After", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_3_After", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_4_After", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_5_After", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_6_After", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_7_After", "Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_8_After"}; - static constexpr double EtaCut[EtaIntervals + 1] = {-0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8}; - static constexpr double CentClasses[CentralityClasses + 1] = {0.0, 1.0, 5.0, 10.0, 15.0, 20.0, 30.0, 40.0, 50.0, 70.0, 100.0}; + + static constexpr std::array EtaCut = {-0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8}; + static constexpr std::array CentClasses = {0.0, 1.0, 5.0, 10.0, 15.0, 20.0, 30.0, 40.0, 50.0, 70.0, 100.0}; Configurable> calibrationFactorNeg{"calibrationFactorNeg", {50.4011, 50.4764, 50.186, 49.2955, 48.8222, 49.4273, 49.9292, 50.0556}, "negative calibration factors"}; Configurable> calibrationFactorPos{"calibrationFactorPos", {50.5157, 50.6359, 50.3198, 49.3345, 48.9197, 49.4931, 50.0188, 50.1406}, "positive calibration factors"}; ConfigurableAxis binP{"binP", {VARIABLE_WIDTH, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 18.0, 20.0}, ""}; - ConfigurableAxis centBins{"centBins", {100, 0, 100}, "Binning for centralidad"}; - ConfigurableAxis dedxBins{"dedxBins", {100, 0, 100}, "Binning for dedx"}; - ConfigurableAxis pFineBins{"pFineBins", {1995, 0.1, 40}, "Binning for momentum"}; + ConfigurableAxis centBins{"centBins", {100, 0, 100}, "Binning for centralidad plots"}; + ConfigurableAxis dedxBins{"dedxBins", {100, 0, 100}, "Binning for dedx plots"}; + ConfigurableAxis pFineBins{"pFineBins", {1995, 0.1, 40}, "Binning for momentum plots"}; + ConfigurableAxis dcaBins{"dcaBins", {500, -0.5, 0.5}, "Binning for DCA plots"}; // phi cut fits TF1* fphiCutHigh = nullptr; @@ -331,6 +327,13 @@ struct DedxPidAnalysis { } else if (v0SelectionMode == V0TPCTOF) { LOGF(info, "V0 seleccion using TOF + TPC"); } + if (v0SigmaMode == V0NoSigmaCut) { + LOGF(info, "V0 sigma mode: no cut"); + } else if (v0SigmaMode == V0SigmaOnly) { + LOGF(info, "V0 sigma mode: sigma only"); + } else if (v0SigmaMode == V0TOFAndSigma) { + LOGF(info, "V0 sigma mode: TOF + sigma above tpcMomentumCut"); + } if (calibrationMode) { LOGF(info, "Calibration mode activated"); } else { @@ -369,6 +372,7 @@ struct DedxPidAnalysis { AxisSpec centAxis{centBins, "Undefined multiplicity estimator"}; AxisSpec pFineAxis{pFineBins, "#it{p} (GeV/c)"}; AxisSpec pTFineAxis{pFineBins, "#it{p}_{T} (GeV/c)"}; + AxisSpec dcaAxis{dcaBins, ""}; switch (multiplicityEstimator) { case MultSelectionMode::NoMultiplicity: // No multiplicity LOGF(info, "No multiplicity estimator applied"); @@ -426,6 +430,11 @@ struct DedxPidAnalysis { LOGF(info, "=== Phi Cut Parameters ==="); LOGF(info, "Low cut: %.6f/x² + pi/18 - %.6f", lowParam1.value, lowParam2.value); LOGF(info, "High cut: %.6f/x + pi/18 + %.6f", highParam1.value, highParam2.value); + const std::array centNames = { + "Cent0_1", "Cent1_5", "Cent5_10", "Cent10_15", "Cent15_20", + "Cent20_30", "Cent30_40", "Cent40_50", "Cent50_70", "Cent70_100", "MB"}; + const std::array v0Names = { + "all", "Pi_v0", "Pr_v0", "El_v0"}; if (calibrationMode) { // MIP for pions @@ -488,23 +497,26 @@ struct DedxPidAnalysis { // De/Dx for ch and v0 particles for (int i = 0; i < ParticlesType; ++i) { - registryDeDx.add(DedxvsMomentumPos[i].data(), "dE/dx", HistType::kTH3F, - {{pAxisTrack}, {dedxAxis}, {etaAxis}}); - registryDeDx.add(DedxvsMomentumNeg[i].data(), "dE/dx", HistType::kTH3F, - {{pAxisTrack}, {dedxAxis}, {etaAxis}}); + const auto& part = v0Names[i]; + hDedxvsMomentumPos[i] = registryDeDx.add(Form("dEdx_vs_Momentum_%s_Pos", part.c_str()), + "dE/dx vs Momentum Positive", kTH3F, {{pAxisTrack}, {dedxAxis}, {etaAxis}}); + hDedxvsMomentumNeg[i] = registryDeDx.add(Form("dEdx_vs_Momentum_%s_Neg", part.c_str()), + "dE/dx vs Momentum Negative", kTH3F, {{pAxisTrack}, {dedxAxis}, {etaAxis}}); } for (int i = 0; i < CentralityClasses; ++i) { - hDedxVsMomentumVsCentPos[i] = registryDeDx.add(DedxvsMomentumvsCentPos[i].data(), "dE/dx", HistType::kTH3F, {{pAxisTrack}, {dedxAxis}, {etaAxis}}); - hDedxVsMomentumVsCentNeg[i] = registryDeDx.add(DedxvsMomentumvsCentNeg[i].data(), "dE/dx", HistType::kTH3F, {{pAxisTrack}, {dedxAxis}, {etaAxis}}); + const auto& cent = centNames[i]; + hDedxVsMomentumVsCentPos[i] = registryDeDx.add(Form("dEdx_vs_Momentum_%s_Pos", cent.c_str()), "dE/dx vs Momentum Positive", HistType::kTH3F, {{pAxisTrack}, {dedxAxis}, {etaAxis}}); + hDedxVsMomentumVsCentNeg[i] = registryDeDx.add(Form("dEdx_vs_Momentum_%s_Neg", cent.c_str()), "dE/dx vs Momentum Negative", HistType::kTH3F, {{pAxisTrack}, {dedxAxis}, {etaAxis}}); } for (int i = 0; i < CentralityClasses + 1; ++i) { - hDedxVspTMomentumVsCent[i] = registryDeDx.add(DedxvspTMomentumvsCent[i].data(), "dE/dx", HistType::kTH3F, {{ptAxis}, {dedxAxis}, {etaAxis}}); - hMomentumVsEtaPos[i] = registryDeDx.add(CentpPos[i].data(), "p vs eta", HistType::kTH2F, {{etaAxis}, {pFineAxis}}); - hMomentumVsEtaNeg[i] = registryDeDx.add(CentpNeg[i].data(), "p vs eta", HistType::kTH2F, {{etaAxis}, {pFineAxis}}); - hpTVsEtaPos[i] = registryDeDx.add(CentpTPos[i].data(), "pT vs eta", HistType::kTH2F, {{etaAxis}, {pTFineAxis}}); - hpTVsEtaNeg[i] = registryDeDx.add(CentpTNeg[i].data(), "pT vs eta", HistType::kTH2F, {{etaAxis}, {pTFineAxis}}); + const auto& cent = centNames[i]; + hDedxVspTMomentumVsCent[i] = registryDeDx.add(Form("dEdx_vs_pT_%s", cent.c_str()), "dE/dx vs pT", HistType::kTH3F, {{ptAxis}, {dedxAxis}, {etaAxis}}); + hMomentumVsEtaPos[i] = registryDeDx.add(Form("p_vs_eta_%s_Pos", cent.c_str()), "p vs eta", HistType::kTH2F, {{etaAxis}, {pFineAxis}}); + hMomentumVsEtaNeg[i] = registryDeDx.add(Form("p_vs_eta_%s_Neg", cent.c_str()), "p vs eta", HistType::kTH2F, {{etaAxis}, {pFineAxis}}); + hpTVsEtaPos[i] = registryDeDx.add(Form("pT_vs_eta_%s_Pos", cent.c_str()), "pT vs eta", HistType::kTH2F, {{etaAxis}, {pTFineAxis}}); + hpTVsEtaNeg[i] = registryDeDx.add(Form("pT_vs_eta_%s_Neg", cent.c_str()), "pT vs eta", HistType::kTH2F, {{etaAxis}, {pTFineAxis}}); } // Invariant Mass @@ -571,33 +583,41 @@ struct DedxPidAnalysis { "hp_vs_phi_NclPID_TPC_Before", "phi cut vs p", HistType::kTH3F, {{pAxis}, {100, 0.0, 0.4, "#varphi^{'}"}, {100, 0, 160, "N_{cl, PID}"}}); } - // Ncl vs de/dx TPC + // Ncl vs de/dx TPC (found) if (nClTPCFoundCut) { for (int i = 0; i < EtaIntervals; ++i) { - registryDeDx.add(NclTPCDedxMomentumPosBefore[i].data(), "Ncl found TPC vs dE/dx vs Momentum Positive before", HistType::kTH3F, - {{100, 0, 160, "N_{cl, found}^{TPC}"}, {dedxAxis}, {pAxis}}); - registryDeDx.add(NclTPCDedxMomentumNegBefore[i].data(), "Ncl found TPC vs dE/dx vs Momentum Negative before", HistType::kTH3F, - {{100, 0, 160, "N_{cl, found}^{TPC}"}, {dedxAxis}, {pAxis}}); - - registryDeDx.add(NclTPCDedxMomentumPosAfter[i].data(), "Ncl found TPC vs dE/dx vs Momentum Positive after", HistType::kTH3F, - {{100, 0, 160, "N_{cl, found}^{TPC}"}, {dedxAxis}, {pAxis}}); - registryDeDx.add(NclTPCDedxMomentumNegAfter[i].data(), "Ncl found TPC vs dE/dx vs Momentum Negative after", HistType::kTH3F, - {{100, 0, 160, "N_{cl, found}^{TPC}"}, {dedxAxis}, {pAxis}}); + hNclFoundTPCPosBefore[i] = registryDeDx.add(Form("Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_%d_Before", i + 1), + "Ncl found TPC vs dE/dx vs Momentum Positive before", HistType::kTH3F, + {{100, 0, 160, "N_{cl, found}^{TPC}"}, {dedxAxis}, {pAxis}}); + hNclFoundTPCNegBefore[i] = registryDeDx.add(Form("Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_%d_Before", i + 1), + "Ncl found TPC vs dE/dx vs Momentum Negative before", HistType::kTH3F, + {{100, 0, 160, "N_{cl, found}^{TPC}"}, {dedxAxis}, {pAxis}}); + + hNclFoundTPCPosAfter[i] = registryDeDx.add(Form("Ncl_FoundTPC_vs_dEdx_vs_Momentum_Pos_%d_After", i + 1), + "Ncl found TPC vs dE/dx vs Momentum Positive after", HistType::kTH3F, + {{100, 0, 160, "N_{cl, found}^{TPC}"}, {dedxAxis}, {pAxis}}); + hNclFoundTPCNegAfter[i] = registryDeDx.add(Form("Ncl_FoundTPC_vs_dEdx_vs_Momentum_Neg_%d_After", i + 1), + "Ncl found TPC vs dE/dx vs Momentum Negative after", HistType::kTH3F, + {{100, 0, 160, "N_{cl, found}^{TPC}"}, {dedxAxis}, {pAxis}}); } } - // Ncl vs de/dx ITS + // Ncl vs de/dx PID TPC if (nClTPCPIDCut) { for (int i = 0; i < EtaIntervals; ++i) { - registryDeDx.add(NclPIDTPCDedxMomentumPosBefore[i].data(), "Ncl PID TPC vs dE/dx vs Momentum Positive before", HistType::kTH3F, - {{100, 0, 160, "N_{cl, PID}^{TPC}"}, {dedxAxis}, {pAxis}}); - registryDeDx.add(NclPIDTPCDedxMomentumNegBefore[i].data(), "Ncl PID TPC vs dE/dx vs Momentum Negative before", HistType::kTH3F, - {{100, 0, 160, "N_{cl, PID}^{TPC}"}, {dedxAxis}, {pAxis}}); - - registryDeDx.add(NclPIDTPCDedxMomentumPosAfter[i].data(), "Ncl PID TPC vs dE/dx vs Momentum Positive after", HistType::kTH3F, - {{100, 0, 160, "N_{cl, PID}^{TPC}"}, {dedxAxis}, {pAxis}}); - registryDeDx.add(NclPIDTPCDedxMomentumNegAfter[i].data(), "Ncl PID TPC vs dE/dx vs Momentum Negative after", HistType::kTH3F, - {{100, 0, 160, "N_{cl, PID}^{TPC}"}, {dedxAxis}, {pAxis}}); + hNclPIDTPCPosBefore[i] = registryDeDx.add(Form("Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_%d_Before", i + 1), + "Ncl PID TPC vs dE/dx vs Momentum Positive before", HistType::kTH3F, + {{100, 0, 160, "N_{cl, PID}^{TPC}"}, {dedxAxis}, {pAxis}}); + hNclPIDTPCNegBefore[i] = registryDeDx.add(Form("Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_%d_Before", i + 1), + "Ncl PID TPC vs dE/dx vs Momentum Negative before", HistType::kTH3F, + {{100, 0, 160, "N_{cl, PID}^{TPC}"}, {dedxAxis}, {pAxis}}); + + hNclPIDTPCPosAfter[i] = registryDeDx.add(Form("Ncl_PIDTPC_vs_dEdx_vs_Momentum_Pos_%d_After", i + 1), + "Ncl PID TPC vs dE/dx vs Momentum Positive after", HistType::kTH3F, + {{100, 0, 160, "N_{cl, PID}^{TPC}"}, {dedxAxis}, {pAxis}}); + hNclPIDTPCNegAfter[i] = registryDeDx.add(Form("Ncl_PIDTPC_vs_dEdx_vs_Momentum_Neg_%d_After", i + 1), + "Ncl PID TPC vs dE/dx vs Momentum Negative after", HistType::kTH3F, + {{100, 0, 160, "N_{cl, PID}^{TPC}"}, {dedxAxis}, {pAxis}}); } } // eta @@ -718,14 +738,18 @@ struct DedxPidAnalysis { registryDeDx.add("hTPCPIDAfter", "N clusters TPC PID After", HistType::kTH1F, {{200, 0, 200, "N_{cl,PID, After}"}}); // DCA cut + registryDeDx.add("hDCAxyVsPt_beforeAnyCut", "DCAxy vs pT before any tkr cut;#it{p}_{T} (GeV/c);DCA_{xy} (cm)", + HistType::kTH2F, {{ptAxis}, {dcaAxis}}); + registryDeDx.add("hDCAzVsPt_beforeAnyCut", "DCAz vs pT before any tkr cut;#it{p}_{T} (GeV/c);DCA_{z} (cm)", + HistType::kTH2F, {{ptAxis}, {dcaAxis}}); registryDeDx.add("hDCAxyVsPt_before", "DCAxy vs pT before cut;#it{p}_{T} (GeV/c);DCA_{xy} (cm)", - HistType::kTH2F, {{ptAxis}, {200, -0.5, 0.5}}); + HistType::kTH2F, {{ptAxis}, {dcaAxis}}); registryDeDx.add("hDCAzVsPt_before", "DCAz vs pT before cut;#it{p}_{T} (GeV/c);DCA_{z} (cm)", - HistType::kTH2F, {{ptAxis}, {200, -0.5, 0.5}}); + HistType::kTH2F, {{ptAxis}, {dcaAxis}}); registryDeDx.add("hDCAxyVsPt_after", "DCAxy vs pT after cut;#it{p}_{T} (GeV/c);DCA_{xy} (cm)", - HistType::kTH2F, {{ptAxis}, {200, -0.5, 0.5}}); + HistType::kTH2F, {{ptAxis}, {dcaAxis}}); registryDeDx.add("hDCAzVsPt_after", "DCAz vs pT after cut;#it{p}_{T} (GeV/c);DCA_{z} (cm)", - HistType::kTH2F, {{ptAxis}, {200, -0.5, 0.5}}); + HistType::kTH2F, {{ptAxis}, {dcaAxis}}); // Event Counter registryDeDx.add("evsel", "events selected", HistType::kTH1F, {{6, 0.5, 6.5, ""}}); @@ -816,7 +840,7 @@ struct DedxPidAnalysis { template bool passesDCAzCut(const T1& track) const { - const float maxiDcaZ = nSigmaDCAz.value * (maxDCAz.value) / 3.0; + const float maxiDcaZ = nSigmaDCAz.value * (dcaZp0.value + dcaZp1.value / std::pow(track.pt(), dcaZp2.value)) / 3.0; return std::abs(track.dcaZ()) < maxiDcaZ; } // Momentum @@ -872,16 +896,24 @@ struct DedxPidAnalysis { sigman = std::hypot(ntrack.tpcNSigmaPi(), ntrack.tofNSigmaPi()); } - if (ptrack.tpcInnerParam() > tpcMomentumCut) { - if (!ptrack.hasTOF()) - return false; + if (v0SigmaMode == V0TOFAndSigma) { + // TOF + sigma + if (ptrack.tpcInnerParam() > tpcMomentumCut) { + if (!ptrack.hasTOF()) + return false; + if (std::abs(sigmap) > nsigmaMax) + return false; + } + if (ntrack.tpcInnerParam() > tpcMomentumCut) { + if (!ntrack.hasTOF()) + return false; + if (std::abs(sigman) > nsigmaMax) + return false; + } + } else if (v0SigmaMode == V0SigmaOnly) { + // sigma only if (std::abs(sigmap) > nsigmaMax) return false; - } - - if (ntrack.tpcInnerParam() > tpcMomentumCut) { - if (!ntrack.hasTOF()) - return false; if (std::abs(sigman) > nsigmaMax) return false; } @@ -953,16 +985,24 @@ struct DedxPidAnalysis { sigman = std::hypot(ntrack.tpcNSigmaPi(), ntrack.tofNSigmaPi()); } - if (ptrack.tpcInnerParam() > tpcMomentumCut) { - if (!ptrack.hasTOF()) - return false; + if (v0SigmaMode == V0TOFAndSigma) { + // TOF + sigma + if (ptrack.tpcInnerParam() > tpcMomentumCut) { + if (!ptrack.hasTOF()) + return false; + if (std::abs(sigmap) > nsigmaMax) + return false; + } + if (ntrack.tpcInnerParam() > tpcMomentumCut) { + if (!ntrack.hasTOF()) + return false; + if (std::abs(sigman) > nsigmaMax) + return false; + } + } else if (v0SigmaMode == V0SigmaOnly) { + // sigma only if (std::abs(sigmap) > nsigmaMax) return false; - } - - if (ntrack.tpcInnerParam() > tpcMomentumCut) { - if (!ntrack.hasTOF()) - return false; if (std::abs(sigman) > nsigmaMax) return false; } @@ -1027,15 +1067,24 @@ struct DedxPidAnalysis { sigmap = std::hypot(ptrack.tpcNSigmaPi(), ptrack.tofNSigmaPi()); sigman = std::hypot(ntrack.tpcNSigmaPr(), ntrack.tofNSigmaPr()); } - if (ptrack.tpcInnerParam() > tpcMomentumCut) { - if (!ptrack.hasTOF()) - return false; - if (std::abs(sigmap) > nsigmaMax) - return false; - } - if (ntrack.tpcInnerParam() > tpcMomentumCut) { - if (!ntrack.hasTOF()) + if (v0SigmaMode == V0TOFAndSigma) { + // TOF + sigma + if (ptrack.tpcInnerParam() > tpcMomentumCut) { + if (!ptrack.hasTOF()) + return false; + if (std::abs(sigmap) > nsigmaMax) + return false; + } + if (ntrack.tpcInnerParam() > tpcMomentumCut) { + if (!ntrack.hasTOF()) + return false; + if (std::abs(sigman) > nsigmaMax) + return false; + } + } else if (v0SigmaMode == V0SigmaOnly) { + // sigma only + if (std::abs(sigmap) > nsigmaMax) return false; if (std::abs(sigman) > nsigmaMax) return false; @@ -1104,19 +1153,28 @@ struct DedxPidAnalysis { sigman = std::hypot(ntrack.tpcNSigmaEl(), ntrack.tofNSigmaEl()); } - if (ptrack.tpcInnerParam() > tpcMomentumCut) { - if (!ptrack.hasTOF()) - return false; + if (v0SigmaMode == V0TOFAndSigma) { + // TOF + sigma + if (ptrack.tpcInnerParam() > tpcMomentumCut) { + if (!ptrack.hasTOF()) + return false; + if (std::abs(sigmap) > nsigmaMax) + return false; + } + if (ntrack.tpcInnerParam() > tpcMomentumCut) { + if (!ntrack.hasTOF()) + return false; + if (std::abs(sigman) > nsigmaMax) + return false; + } + } else if (v0SigmaMode == V0SigmaOnly) { + // sigma only if (std::abs(sigmap) > nsigmaMax) return false; - } - - if (ntrack.tpcInnerParam() > tpcMomentumCut) { - if (!ntrack.hasTOF()) - return false; if (std::abs(sigman) > nsigmaMax) return false; } + const float gammaMass = 2 * MassElectron; // GeV/c^2 if (fillHist) @@ -1156,7 +1214,7 @@ struct DedxPidAnalysis { } // Phi cut template - bool passedPhiCutPri(const T& trk, float magField, const TF1& fphiCutLow, const TF1& fphiCutHigh) + bool passedPhiCutPri(const T& trk, float magField) { float p = trk.p(); float pt = trk.pt(); @@ -1183,7 +1241,7 @@ struct DedxPidAnalysis { registryDeDx.fill(HIST("hp_vs_phi_NclPID_TPC_Before"), p, phi, nTPCPIDCl); // cut phi - if (phi < fphiCutHigh.Eval(pt) && phi > fphiCutLow.Eval(pt)) + if (phi < fphiCutHigh->Eval(pt) && phi > fphiCutLow->Eval(pt)) return false; // reject track registryDeDx.fill(HIST("hpt_vs_phi_NclFound_TPC_After"), pt, phi, nTPCCl); @@ -1202,107 +1260,29 @@ struct DedxPidAnalysis { float sigP = trk.sign() * getMomentum(trk); auto nTPCCl = trk.tpcNClsFound(); - if (eta >= EtaCut[0] && eta < EtaCut[1]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclTPCDedxMomentumNegBefore[0]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclTPCDedxMomentumPosBefore[0]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[1] && eta < EtaCut[2]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclTPCDedxMomentumNegBefore[1]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclTPCDedxMomentumPosBefore[1]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[2] && eta < EtaCut[3]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclTPCDedxMomentumNegBefore[2]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclTPCDedxMomentumPosBefore[2]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[3] && eta < EtaCut[4]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclTPCDedxMomentumNegBefore[3]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclTPCDedxMomentumPosBefore[3]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[4] && eta < EtaCut[5]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclTPCDedxMomentumNegBefore[4]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclTPCDedxMomentumPosBefore[4]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[5] && eta < EtaCut[6]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclTPCDedxMomentumNegBefore[5]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclTPCDedxMomentumPosBefore[5]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[6] && eta < EtaCut[7]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclTPCDedxMomentumNegBefore[6]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclTPCDedxMomentumPosBefore[6]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[7] && eta < EtaCut[8]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclTPCDedxMomentumNegBefore[7]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclTPCDedxMomentumPosBefore[7]), nTPCCl, trk.tpcSignal(), sigP); + int etaIndex = -1; + for (int i = 0; i < EtaIntervals; ++i) { + if (eta >= EtaCut[i] && eta < EtaCut[i + 1]) { + etaIndex = i; + break; } } + if (etaIndex == -1) + return false; + + if (sigP < 0) { + hNclFoundTPCNegBefore[etaIndex]->Fill(nTPCCl, trk.tpcSignal(), std::abs(sigP)); + } else { + hNclFoundTPCPosBefore[etaIndex]->Fill(nTPCCl, trk.tpcSignal(), sigP); + } if (nTPCCl < minTPCnClsFound) return false; - if (eta >= EtaCut[0] && eta < EtaCut[1]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclTPCDedxMomentumNegAfter[0]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclTPCDedxMomentumPosAfter[0]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[1] && eta < EtaCut[2]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclTPCDedxMomentumNegAfter[1]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclTPCDedxMomentumPosAfter[1]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[2] && eta < EtaCut[3]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclTPCDedxMomentumNegAfter[2]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclTPCDedxMomentumPosAfter[2]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[3] && eta < EtaCut[4]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclTPCDedxMomentumNegAfter[3]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclTPCDedxMomentumPosAfter[3]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[4] && eta < EtaCut[5]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclTPCDedxMomentumNegAfter[4]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclTPCDedxMomentumPosAfter[4]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[5] && eta < EtaCut[6]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclTPCDedxMomentumNegAfter[5]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclTPCDedxMomentumPosAfter[5]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[6] && eta < EtaCut[7]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclTPCDedxMomentumNegAfter[6]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclTPCDedxMomentumPosAfter[6]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[7] && eta < EtaCut[8]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclTPCDedxMomentumNegAfter[7]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclTPCDedxMomentumPosAfter[7]), nTPCCl, trk.tpcSignal(), sigP); - } + if (sigP < 0) { + hNclFoundTPCNegAfter[etaIndex]->Fill(nTPCCl, trk.tpcSignal(), std::abs(sigP)); + } else { + hNclFoundTPCPosAfter[etaIndex]->Fill(nTPCCl, trk.tpcSignal(), sigP); } return true; @@ -1316,107 +1296,29 @@ struct DedxPidAnalysis { float sigP = trk.sign() * getMomentum(trk); auto nTPCCl = trk.tpcNClsPID(); - if (eta >= EtaCut[0] && eta < EtaCut[1]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumNegBefore[0]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumPosBefore[0]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[1] && eta < EtaCut[2]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumNegBefore[1]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumPosBefore[1]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[2] && eta < EtaCut[3]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumNegBefore[2]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumPosBefore[2]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[3] && eta < EtaCut[4]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumNegBefore[3]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumPosBefore[3]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[4] && eta < EtaCut[5]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumNegBefore[4]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumPosBefore[4]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[5] && eta < EtaCut[6]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumNegBefore[5]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumPosBefore[5]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[6] && eta < EtaCut[7]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumNegBefore[6]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumPosBefore[6]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[7] && eta < EtaCut[8]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumNegBefore[7]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumPosBefore[7]), nTPCCl, trk.tpcSignal(), sigP); + int etaIndex = -1; + for (int i = 0; i < EtaIntervals; ++i) { + if (eta >= EtaCut[i] && eta < EtaCut[i + 1]) { + etaIndex = i; + break; } } + if (etaIndex == -1) + return false; + + if (sigP < 0) { + hNclPIDTPCNegBefore[etaIndex]->Fill(nTPCCl, trk.tpcSignal(), std::abs(sigP)); + } else { + hNclPIDTPCPosBefore[etaIndex]->Fill(nTPCCl, trk.tpcSignal(), sigP); + } if (nTPCCl < minTPCnClsPID) return false; - if (eta >= EtaCut[0] && eta < EtaCut[1]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumNegAfter[0]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumPosAfter[0]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[1] && eta < EtaCut[2]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumNegAfter[1]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumPosAfter[1]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[2] && eta < EtaCut[3]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumNegAfter[2]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumPosAfter[2]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[3] && eta < EtaCut[4]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumNegAfter[3]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumPosAfter[3]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[4] && eta < EtaCut[5]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumNegAfter[4]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumPosAfter[4]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[5] && eta < EtaCut[6]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumNegAfter[5]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumPosAfter[5]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[6] && eta < EtaCut[7]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumNegAfter[6]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumPosAfter[6]), nTPCCl, trk.tpcSignal(), sigP); - } - } else if (eta >= EtaCut[7] && eta < EtaCut[8]) { - if (sigP < 0) { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumNegAfter[7]), nTPCCl, trk.tpcSignal(), std::abs(sigP)); - } else { - registryDeDx.fill(HIST(NclPIDTPCDedxMomentumPosAfter[7]), nTPCCl, trk.tpcSignal(), sigP); - } + if (sigP < 0) { + hNclPIDTPCNegAfter[etaIndex]->Fill(nTPCCl, trk.tpcSignal(), std::abs(sigP)); + } else { + hNclPIDTPCPosAfter[etaIndex]->Fill(nTPCCl, trk.tpcSignal(), sigP); } return true; @@ -1424,7 +1326,7 @@ struct DedxPidAnalysis { // Phi cut Secondaries template - bool passedPhiCutSecondaries(const T& trk, float magField, const TF1& fphiCutLow, const TF1& fphiCutHigh) + bool passedPhiCutSecondaries(const T& trk, float magField) { float pt = trk.pt(); float phi = trk.phi(); @@ -1443,7 +1345,7 @@ struct DedxPidAnalysis { phi = std::fmod(phi, o2::constants::math::PI / 9.0f); // cut phi - if (phi < fphiCutHigh.Eval(pt) && phi > fphiCutLow.Eval(pt)) + if (phi < fphiCutHigh->Eval(pt) && phi > fphiCutLow->Eval(pt)) return false; // reject track return true; @@ -1574,6 +1476,10 @@ struct DedxPidAnalysis { registryDeDx.fill(HIST("hTPCClustersBefore"), trk.tpcNClsFound()); registryDeDx.fill(HIST("hTPCPIDBefore"), trk.tpcNClsPID()); + // Before DCA any tkr cuts + registryDeDx.fill(HIST("hDCAxyVsPt_beforeAnyCut"), trk.pt(), trk.dcaXY()); + registryDeDx.fill(HIST("hDCAzVsPt_beforeAnyCut"), trk.pt(), trk.dcaZ()); + // track Selection wo DCA if (!mySelectionPrim.IsSelected(trk)) continue; @@ -1598,7 +1504,7 @@ struct DedxPidAnalysis { // phi and Ncl cut if (phiVarCut) { - if (!passedPhiCutPri(trk, magField, *fphiCutLow, *fphiCutHigh)) + if (!passedPhiCutPri(trk, magField)) continue; registryDeDx.fill(HIST("trackselAll"), TrkPriCutLabel::PhiVarCutPri); } @@ -1716,7 +1622,7 @@ struct DedxPidAnalysis { for (int i = 0; i < EtaIntervals; ++i) { if (trk.eta() >= EtaCut[i] && trk.eta() < EtaCut[i + 1]) { if (signedP > 0) { - registryDeDx.fill(HIST(DedxvsMomentumPos[0]), signedP, trk.tpcSignal() * 50 / calibrationFactorPos->at(i), trk.eta()); + hDedxvsMomentumPos[0]->Fill(signedP, trk.tpcSignal() * 50 / calibrationFactorPos->at(i), trk.eta()); registryDeDx.fill(HIST("heta_vs_pt_vs_p_all_Pos"), trk.eta(), trk.pt(), trk.p()); hDedxVsMomentumVsCentPos[centIndex]->Fill(signedP, trk.tpcSignal() * 50 / calibrationFactorPos->at(i), trk.eta()); hDedxVspTMomentumVsCent[centIndex]->Fill(signedpT, trk.tpcSignal() * 50 / calibrationFactorPos->at(i), trk.eta()); @@ -1726,7 +1632,7 @@ struct DedxPidAnalysis { hpTVsEtaPos[centIndex]->Fill(trk.eta(), signedpT); hpTVsEtaPos[10]->Fill(trk.eta(), signedpT); } else { - registryDeDx.fill(HIST(DedxvsMomentumNeg[0]), std::abs(signedP), trk.tpcSignal() * 50 / calibrationFactorNeg->at(i), trk.eta()); + hDedxvsMomentumNeg[0]->Fill(std::abs(signedP), trk.tpcSignal() * 50 / calibrationFactorNeg->at(i), trk.eta()); registryDeDx.fill(HIST("heta_vs_pt_vs_p_all_Neg"), trk.eta(), trk.pt(), trk.p()); hDedxVsMomentumVsCentNeg[centIndex]->Fill(std::abs(signedP), trk.tpcSignal() * 50 / calibrationFactorNeg->at(i), trk.eta()); hDedxVspTMomentumVsCent[centIndex]->Fill(std::abs(signedpT), trk.tpcSignal() * 50 / calibrationFactorNeg->at(i), trk.eta()); @@ -1764,10 +1670,10 @@ struct DedxPidAnalysis { // registryDeDx.fill(HIST("trackselSec"), TrkSecCutLabel::TPCRefit); // phi and Ncl cut if (phiVarCut) { - if (!passedPhiCutSecondaries(posTrack, magField, *fphiCutLow, *fphiCutHigh)) + if (!passedPhiCutSecondaries(posTrack, magField)) continue; - if (!passedPhiCutSecondaries(negTrack, magField, *fphiCutLow, *fphiCutHigh)) + if (!passedPhiCutSecondaries(negTrack, magField)) continue; registryDeDx.fill(HIST("trackselSec"), TrkSecCutLabel ::PhiVarCutSec); @@ -1841,10 +1747,10 @@ struct DedxPidAnalysis { registryDeDx.fill(HIST("hArmenterosK0s"), v0.alpha(), v0.qtarm()); for (int i = 0; i < EtaIntervals; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(DedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta()); + hDedxvsMomentumNeg[1]->Fill(std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta()); } if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(DedxvsMomentumPos[1]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactorPos->at(i), posTrack.eta()); + hDedxvsMomentumPos[1]->Fill(signedPpos, posTrack.tpcSignal() * 50 / calibrationFactorPos->at(i), posTrack.eta()); } } } @@ -1859,10 +1765,10 @@ struct DedxPidAnalysis { registryDeDx.fill(HIST("hArmenterosLambda"), v0.alpha(), v0.qtarm()); for (int i = 0; i < EtaIntervals; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(DedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta()); + hDedxvsMomentumNeg[1]->Fill(std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta()); } if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(DedxvsMomentumPos[2]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactorPos->at(i), posTrack.eta()); + hDedxvsMomentumPos[2]->Fill(signedPpos, posTrack.tpcSignal() * 50 / calibrationFactorPos->at(i), posTrack.eta()); } } } @@ -1877,10 +1783,10 @@ struct DedxPidAnalysis { registryDeDx.fill(HIST("hArmenterosAntiLambda"), v0.alpha(), v0.qtarm()); for (int i = 0; i < EtaIntervals; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(DedxvsMomentumNeg[2]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta()); + hDedxvsMomentumNeg[2]->Fill(std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta()); } if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(DedxvsMomentumPos[1]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactorPos->at(i), posTrack.eta()); + hDedxvsMomentumPos[1]->Fill(signedPpos, posTrack.tpcSignal() * 50 / calibrationFactorPos->at(i), posTrack.eta()); } } } @@ -1895,10 +1801,10 @@ struct DedxPidAnalysis { registryDeDx.fill(HIST("hArmenterosGamma"), v0.alpha(), v0.qtarm()); for (int i = 0; i < EtaIntervals; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(DedxvsMomentumNeg[3]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta()); + hDedxvsMomentumNeg[3]->Fill(std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta()); } if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(DedxvsMomentumPos[3]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactorPos->at(i), posTrack.eta()); + hDedxvsMomentumPos[3]->Fill(signedPpos, posTrack.tpcSignal() * 50 / calibrationFactorPos->at(i), posTrack.eta()); } } } diff --git a/PWGLF/Tasks/Nuspex/multiplicityPt.cxx b/PWGLF/Tasks/Nuspex/multiplicityPt.cxx index ac9ff908701..0d01fe6e27e 100644 --- a/PWGLF/Tasks/Nuspex/multiplicityPt.cxx +++ b/PWGLF/Tasks/Nuspex/multiplicityPt.cxx @@ -151,8 +151,15 @@ struct MultiplicityPt { Configurable maxChi2PerClusterTPC{"maxChi2PerClusterTPC", 4.f, "Additional cut on the maximum value of the chi2 per cluster in the TPC"}; Configurable minChi2PerClusterTPC{"minChi2PerClusterTPC", 0.5f, "Additional cut on the minimum value of the chi2 per cluster in the TPC"}; Configurable maxChi2PerClusterITS{"maxChi2PerClusterITS", 36.f, "Additional cut on the maximum value of the chi2 per cluster in the ITS"}; - Configurable maxDcaXYFactor{"maxDcaXYFactor", 1.f, "Additional cut on the maximum value of the DCA xy (multiplicative factor)"}; - Configurable maxDcaZ{"maxDcaZ", 2.0f, "Additional cut on the maximum value of the DCA z"}; + Configurable nSigmaDCAxy{"nSigmaDCAxy", 1.f, "Additional cut on the maximum value of the DCA xy (multiplicative factor)"}; + Configurable dcaXYp0{"dcaXYp0", 0.0105f, "DCAxy formula: p0 + p1/pt^p2"}; + Configurable dcaXYp1{"dcaXYp1", 0.0350f, "DCAxy p1 parameter"}; + Configurable dcaXYp2{"dcaXYp2", 1.1f, "DCAxy p2 parameter"}; + Configurable nSigmaDCAz{"nSigmaDCAz", 1.f, "Additional cut on the maximum value of the DCA z (multiplicative factor)"}; + Configurable dcaZp0{"dcaZp0", 0.0105f, "DCAz formula: p0 + p1/pt^p2"}; + Configurable dcaZp1{"dcaZp1", 0.0350f, "DCAz p1 parameter"}; + Configurable dcaZp2{"dcaZp2", 1.1f, "DCAz p2 parameter"}; + // Configurable maxDcaZ{"maxDcaZ", 2.0f, "Additional cut on the maximum value of the DCA z"}; Configurable minTPCNClsFound{"minTPCNClsFound", 70.0f, "min number of found TPC clusters"}; Configurable minTPCNClsPID{"minTPCNClsPID", 130.0f, "min number of PID TPC clusters"}; Configurable nClTPCFoundCut{"nClTPCFoundCut", false, "Apply TPC found clusters cut"}; @@ -187,6 +194,7 @@ struct MultiplicityPt { ConfigurableAxis pFineBins{"pFineBins", {1995, 0.1, 40}, "Binning for momentum"}; ConfigurableAxis dedxBins{"dedxBins", {100, 0, 100}, "Binning for dedx"}; std::vector centBinningStd = {0., 1., 5., 10., 15., 20., 30., 40., 50., 70., 100.}; + ConfigurableAxis dcaBins{"dcaBins", {200, -0.5, 0.5}, "Binning for DCA plots"}; // ── Custom track-selection object ──────────────────────── TrackSelection customTrackCuts; @@ -209,7 +217,6 @@ struct MultiplicityPt { static constexpr float MinCharge = 3.0f; static constexpr int CentralityClasses = 10; - static constexpr double CentClasses[CentralityClasses + 1] = {0.0, 1.0, 5.0, 10.0, 15.0, 20.0, 30.0, 40.0, 50.0, 70.0, 100.0}; static constexpr int ParticleTypes = 4; // Response Matrix histogram names @@ -255,7 +262,7 @@ struct MultiplicityPt { customTrackCuts.SetMinNCrossedRowsTPC(minNCrossedRowsTPC.value); customTrackCuts.SetMinNCrossedRowsOverFindableClustersTPC(minNCrossedRowsOverFindableClustersTPC.value); customTrackCuts.SetMaxDcaXYPtDep([](float /*pt*/) { return 10000.f; }); - customTrackCuts.SetMaxDcaZ(maxDcaZ.value); + // customTrackCuts.SetMaxDcaZ(maxDcaZ.value); } // Initialize phi cut functions if enabled @@ -295,7 +302,7 @@ struct MultiplicityPt { const AxisSpec dcaXYAxis{105, -1.05f, 1.05f, "DCA_{xy} (cm)"}; const AxisSpec zvtxAxis{60, -30.0, 30.0, "Vtx_{z} (cm)"}; const AxisSpec nclAxis{161, -0.5, 160.5, "N_{cl} TPC"}; - + AxisSpec dcaAxis{dcaBins, ""}; // ======================================================================== // EVENT COUNTER AND BASIC HISTOGRAMS // ======================================================================== @@ -617,6 +624,18 @@ struct MultiplicityPt { registry.add("PhiCut/hPtVsPhiPrimeAfter", "pT vs #phi' after cut;p_{T};#phi'", kTH2F, {{100, 0, 10}, {100, 0, 0.4}}); } + // ======================================================================== + // DCA CUT MONITORING + // ======================================================================== + + registry.add("hDCAxyVsPt_before", "DCAxy vs pT before cut;#it{p}_{T} (GeV/c);DCA_{xy} (cm)", + HistType::kTH2F, {{ptAxis}, {dcaAxis}}); + registry.add("hDCAzVsPt_before", "DCAz vs pT before cut;#it{p}_{T} (GeV/c);DCA_{z} (cm)", + HistType::kTH2F, {{ptAxis}, {dcaAxis}}); + registry.add("hDCAxyVsPt_after", "DCAxy vs pT after cut;#it{p}_{T} (GeV/c);DCA_{xy} (cm)", + HistType::kTH2F, {{ptAxis}, {dcaAxis}}); + registry.add("hDCAzVsPt_after", "DCAz vs pT after cut;#it{p}_{T} (GeV/c);DCA_{z} (cm)", + HistType::kTH2F, {{ptAxis}, {dcaAxis}}); // ======================================================================== // CALIBRATION HISTOGRAMS @@ -711,7 +730,7 @@ struct MultiplicityPt { LOG(info) << "cfgINELCut = " << cfgINELCut.value; LOG(info) << "selTVXMC = " << selTVXMC.value; LOG(info) << "applyPhiCut = " << applyPhiCut.value; - LOG(info) << "maxDcaZ = " << maxDcaZ.value; + // LOG(info) << "maxDcaZ = " << maxDcaZ.value; } // Get magnetic field from CCDB @@ -790,19 +809,26 @@ struct MultiplicityPt { return true; } - template - bool passesDCAxyCut(const T& track) const + // DCA xy cut + template + bool passesDCAxyCut(const T1& track) const { - constexpr float C = 0.0105f, S = 0.0350f, P = 1.1f; - const float maxDCAxy = maxDcaXYFactor.value * (C + S / std::pow(track.pt(), P)); - return std::abs(track.dcaXY()) <= maxDCAxy; + const float maxDcaXY = nSigmaDCAxy.value * (dcaXYp0.value + dcaXYp1.value / std::pow(track.pt(), dcaXYp2.value)) / 3.0; + return std::abs(track.dcaXY()) < maxDcaXY; + } + // DCA z cut + template + bool passesDCAzCut(const T1& track) const + { + const float maxiDcaZ = nSigmaDCAz.value * (dcaZp0.value + dcaZp1.value / std::pow(track.pt(), dcaZp2.value)) / 3.0; + return std::abs(track.dcaZ()) < maxiDcaZ; } // Full track selection template bool passesTrackSelection(const T& track) const { - return passesTrackSelectionNoDCA(track) && passesDCAxyCut(track); + return passesTrackSelectionNoDCA(track) && passesDCAxyCut(track) && passesDCAzCut(track); } template @@ -1138,6 +1164,10 @@ struct MultiplicityPt { if (!track.has_mcParticle()) continue; + // Before DCA cuts + registry.fill(HIST("hDCAxyVsPt_before"), track.pt(), track.dcaXY()); + registry.fill(HIST("hDCAzVsPt_before"), track.pt(), track.dcaZ()); + if (applyPhiCut.value && track.pt() >= pTthresholdPhiCut.value) { float phiPrime = getTransformedPhi(track.phi(), track.sign(), magField); registry.fill(HIST("PhiCut/hPtVsPhiPrimeBefore"), track.pt(), phiPrime); @@ -1172,38 +1202,6 @@ struct MultiplicityPt { if (centIndex == -1) continue; - // ==================================================================== - // DEDX VS MOMENTUM HISTOGRAMS FILLING - ALL TRACKS - // ==================================================================== - hDedxVspTMomentumVsCent[10]->Fill(track.pt(), tpcSignal, eta); - if (charge > 0) { - registry.fill(HIST("DedxVsMomentum/dEdx_vs_Momentum_all_Pos"), momentum, tpcSignal, eta); - hDedxVsMomentumVsCentPos[centIndex]->Fill(momentum, tpcSignal, eta); - hDedxVspTMomentumVsCent[centIndex]->Fill(track.pt(), tpcSignal, eta); - hMomentumVsEtaPos[centIndex]->Fill(eta, momentum); - hMomentumVsEtaPos[10]->Fill(eta, momentum); - hpTVsEtaPos[centIndex]->Fill(eta, track.pt()); - hpTVsEtaPos[10]->Fill(eta, track.pt()); - registry.fill(HIST("ResponseMatrix/heta_vs_pt_vs_p_all_Pos"), eta, track.pt(), momentum); - } else { - registry.fill(HIST("DedxVsMomentum/dEdx_vs_Momentum_all_Neg"), momentum, tpcSignal, eta); - hDedxVsMomentumVsCentNeg[centIndex]->Fill(momentum, tpcSignal, eta); - hDedxVspTMomentumVsCent[centIndex]->Fill(track.pt(), tpcSignal, eta); - hMomentumVsEtaNeg[centIndex]->Fill(eta, momentum); - hMomentumVsEtaNeg[10]->Fill(eta, momentum); - hpTVsEtaNeg[centIndex]->Fill(eta, track.pt()); - hpTVsEtaNeg[10]->Fill(eta, track.pt()); - registry.fill(HIST("ResponseMatrix/heta_vs_pt_vs_p_all_Neg"), eta, track.pt(), momentum); - } - - if (isPrimary) { - if (charge > 0) { - registry.fill(HIST("ResponseMatrix/heta_vs_pt_vs_p_all_Pos_Pri"), eta, track.pt(), momentum); - } else { - registry.fill(HIST("ResponseMatrix/heta_vs_pt_vs_p_all_Neg_Pri"), eta, track.pt(), momentum); - } - } - registry.fill(HIST("hEta"), track.eta()); registry.fill(HIST("hPhi"), track.phi()); registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); @@ -1251,6 +1249,10 @@ struct MultiplicityPt { if (!passesTrackSelection(track)) continue; + // After Trk cuts + registry.fill(HIST("hDCAxyVsPt_after"), track.pt(), track.dcaXY()); + registry.fill(HIST("hDCAzVsPt_after"), track.pt(), track.dcaZ()); + if (applyPhiCut.value && !passedPhiCut(track, magField)) continue; @@ -1318,6 +1320,38 @@ struct MultiplicityPt { } } + // ==================================================================== + // DEDX VS MOMENTUM HISTOGRAMS FILLING - ALL TRACKS + // ==================================================================== + hDedxVspTMomentumVsCent[10]->Fill(track.pt(), tpcSignal, eta); + if (charge > 0) { + registry.fill(HIST("DedxVsMomentum/dEdx_vs_Momentum_all_Pos"), momentum, tpcSignal, eta); + hDedxVsMomentumVsCentPos[centIndex]->Fill(momentum, tpcSignal, eta); + hDedxVspTMomentumVsCent[centIndex]->Fill(track.pt(), tpcSignal, eta); + hMomentumVsEtaPos[centIndex]->Fill(eta, momentum); + hMomentumVsEtaPos[10]->Fill(eta, momentum); + hpTVsEtaPos[centIndex]->Fill(eta, track.pt()); + hpTVsEtaPos[10]->Fill(eta, track.pt()); + registry.fill(HIST("ResponseMatrix/heta_vs_pt_vs_p_all_Pos"), eta, track.pt(), momentum); + } else { + registry.fill(HIST("DedxVsMomentum/dEdx_vs_Momentum_all_Neg"), momentum, tpcSignal, eta); + hDedxVsMomentumVsCentNeg[centIndex]->Fill(momentum, tpcSignal, eta); + hDedxVspTMomentumVsCent[centIndex]->Fill(track.pt(), tpcSignal, eta); + hMomentumVsEtaNeg[centIndex]->Fill(eta, momentum); + hMomentumVsEtaNeg[10]->Fill(eta, momentum); + hpTVsEtaNeg[centIndex]->Fill(eta, track.pt()); + hpTVsEtaNeg[10]->Fill(eta, track.pt()); + registry.fill(HIST("ResponseMatrix/heta_vs_pt_vs_p_all_Neg"), eta, track.pt(), momentum); + } + + if (isPrimary) { + if (charge > 0) { + registry.fill(HIST("ResponseMatrix/heta_vs_pt_vs_p_all_Pos_Pri"), eta, track.pt(), momentum); + } else { + registry.fill(HIST("ResponseMatrix/heta_vs_pt_vs_p_all_Neg_Pri"), eta, track.pt(), momentum); + } + } + // ==================================================================== // DEDX VS MOMENTUM HISTOGRAMS FILLING - PARTICLE SPECIFIC // ====================================================================