diff --git a/DPG/Tasks/AOTTrack/qaEfficiency.cxx b/DPG/Tasks/AOTTrack/qaEfficiency.cxx index e327c6e81e1..fc8a15a8215 100644 --- a/DPG/Tasks/AOTTrack/qaEfficiency.cxx +++ b/DPG/Tasks/AOTTrack/qaEfficiency.cxx @@ -19,6 +19,7 @@ #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" #include "Framework/HistogramRegistry.h" +#include "Framework/StaticFor.h" #include "ReconstructionDataFormats/DCA.h" #include "ReconstructionDataFormats/Track.h" #include "Common/Core/TrackSelection.h" @@ -29,7 +30,7 @@ // ROOT includes #include "TPDGCode.h" #include "TEfficiency.h" -#include "TList.h" +#include "THashList.h" using namespace o2::framework; @@ -39,17 +40,8 @@ struct QaEfficiency { static constexpr const char* particleTitle[nSpecies] = {"e", "#mu", "#pi", "K", "p", "d", "t", "^{3}He", "#alpha", "All"}; static constexpr int PDGs[nSpecies] = {kElectron, kMuonMinus, kPiPlus, kKPlus, kProton, 1000010020, 1000010030, 1000020030, 1000020040, 0}; // Track/particle selection - Configurable etaMin{"eta-min", -3.f, "Lower limit in eta"}; - Configurable etaMax{"eta-max", 3.f, "Upper limit in eta"}; - Configurable phiMin{"phi-min", 0.f, "Lower limit in phi"}; - Configurable phiMax{"phi-max", 6.284f, "Upper limit in phi"}; - Configurable yMin{"y-min", -0.5f, "Lower limit in y"}; - Configurable yMax{"y-max", 0.5f, "Upper limit in y"}; - Configurable ptMin{"pt-min", 0.f, "Lower limit in pT"}; - Configurable ptMax{"pt-max", 5.f, "Upper limit in pT"}; - Configurable noFakes{"noFakes", false, "Flag to reject tracks that have fake hits"}; + Configurable noFakesHits{"noFakesHits", false, "Flag to reject tracks that have fake hits"}; // Charge selection - Configurable doSumPDG{"doSumPDG", true, "Flag to fill histograms for summed PDG codes. Required to fill the efficiencies"}; Configurable doPositivePDG{"doPositivePDG", false, "Flag to fill histograms for positive PDG codes."}; Configurable doNegativePDG{"doNegativePDG", false, "Flag to fill histograms for negative PDG codes."}; // Particle only selection @@ -64,604 +56,600 @@ struct QaEfficiency { Configurable doHe{"do-he", false, "Flag to run with the PDG code of helium 3"}; Configurable doAl{"do-al", false, "Flag to run with the PDG code of helium 4"}; // Track only selection, options to select only specific tracks - Configurable trackSelection{"trackSelection", 1, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"}; + Configurable trackSelection{"trackSelection", true, "Local track selection"}; + Configurable globalTrackSelection{"globalTrackSelection", 0, "Global track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"}; // Event selection Configurable nMinNumberOfContributors{"nMinNumberOfContributors", 2, "Minimum required number of contributors to the primary vertex"}; Configurable vertexZMin{"vertex-z-min", -10.f, "Minimum position of the generated vertez in Z (cm)"}; Configurable vertexZMax{"vertex-z-max", 10.f, "Maximum position of the generated vertez in Z (cm)"}; // Histogram configuration - Configurable ptBins{"pt-bins", 500, "Number of pT bins"}; + ConfigurableAxis ptBins{"ptBins", {200, 0.f, 5.f}, "Pt binning"}; Configurable logPt{"log-pt", 0, "Flag to use a logarithmic pT axis"}; - Configurable etaBins{"eta-bins", 500, "Number of eta bins"}; - Configurable yBins{"y-bins", 500, "Number of eta bins"}; - Configurable phiBins{"phi-bins", 500, "Number of phi bins"}; + ConfigurableAxis etaBins{"etaBins", {200, -3.f, 3.f}, "Eta binning"}; + ConfigurableAxis phiBins{"phiBins", {200, 0.f, 6.284f}, "Phi binning"}; + ConfigurableAxis yBins{"yBins", {200, -0.5f, 0.5f}, "Y binning"}; // Task configuration Configurable makeEff{"make-eff", false, "Flag to produce the efficiency with TEfficiency"}; + Configurable doPtEta{"doPtEta", false, "Flag to produce the efficiency vs pT and Eta"}; Configurable applyEvSel{"applyEvSel", 0, "Flag to apply event selection: 0 -> no event selection, 1 -> Run 2 event selection, 2 -> Run 3 event selection"}; - OutputObj listEfficiencyMC{"EfficiencyMC"}; - OutputObj listEfficiencyData{"EfficiencyData"}; + OutputObj listEfficiencyMC{"EfficiencyMC"}; + OutputObj listEfficiencyData{"EfficiencyData"}; // Histograms HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - static constexpr int nHistograms = nSpecies * 3; + HistogramRegistry histosPos{"HistosPos", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry histosNeg{"HistosNeg", {}, OutputObjHandlingPolicy::AnalysisObject}; + static constexpr int nHistograms = nSpecies * 2; + // Pt - static constexpr std::string_view hPtNum[nHistograms] = {"MC/el/sum/pt/num", "MC/mu/sum/pt/num", "MC/pi/sum/pt/num", - "MC/ka/sum/pt/num", "MC/pr/sum/pt/num", "MC/de/sum/pt/num", - "MC/tr/sum/pt/num", "MC/he/sum/pt/num", "MC/al/sum/pt/num", - "MC/all/sum/pt/num", - "MC/el/pos/pt/num", "MC/mu/pos/pt/num", "MC/pi/pos/pt/num", - "MC/ka/pos/pt/num", "MC/pr/pos/pt/num", "MC/de/pos/pt/num", - "MC/tr/pos/pt/num", "MC/he/pos/pt/num", "MC/al/pos/pt/num", - "MC/all/pos/pt/num", - "MC/el/neg/pt/num", "MC/mu/neg/pt/num", "MC/pi/neg/pt/num", - "MC/ka/neg/pt/num", "MC/pr/neg/pt/num", "MC/de/neg/pt/num", - "MC/tr/neg/pt/num", "MC/he/neg/pt/num", "MC/al/neg/pt/num", - "MC/all/neg/pt/num"}; - static constexpr std::string_view hPtNumTrk[nHistograms] = {"MC/el/sum/pt/numtrk", "MC/mu/sum/pt/numtrk", "MC/pi/sum/pt/numtrk", - "MC/ka/sum/pt/numtrk", "MC/pr/sum/pt/numtrk", "MC/de/sum/pt/numtrk", - "MC/tr/sum/pt/numtrk", "MC/he/sum/pt/numtrk", "MC/al/sum/pt/numtrk", - "MC/all/sum/pt/numtrk", - "MC/el/pos/pt/numtrk", "MC/mu/pos/pt/numtrk", "MC/pi/pos/pt/numtrk", - "MC/ka/pos/pt/numtrk", "MC/pr/pos/pt/numtrk", "MC/de/pos/pt/numtrk", - "MC/tr/pos/pt/numtrk", "MC/he/pos/pt/numtrk", "MC/al/pos/pt/numtrk", - "MC/all/pos/pt/numtrk", - "MC/el/neg/pt/numtrk", "MC/mu/neg/pt/numtrk", "MC/pi/neg/pt/numtrk", - "MC/ka/neg/pt/numtrk", "MC/pr/neg/pt/numtrk", "MC/de/neg/pt/numtrk", - "MC/tr/neg/pt/numtrk", "MC/he/neg/pt/numtrk", "MC/al/neg/pt/numtrk", - "MC/all/neg/pt/numtrk"}; - static constexpr std::string_view hPtNumTof[nHistograms] = {"MC/el/sum/pt/numtof", "MC/mu/sum/pt/numtof", "MC/pi/sum/pt/numtof", - "MC/ka/sum/pt/numtof", "MC/pr/sum/pt/numtof", "MC/de/sum/pt/numtof", - "MC/tr/sum/pt/numtof", "MC/he/sum/pt/numtof", "MC/al/sum/pt/numtof", - "MC/all/sum/pt/numtof", - "MC/el/pos/pt/numtof", "MC/mu/pos/pt/numtof", "MC/pi/pos/pt/numtof", - "MC/ka/pos/pt/numtof", "MC/pr/pos/pt/numtof", "MC/de/pos/pt/numtof", - "MC/tr/pos/pt/numtof", "MC/he/pos/pt/numtof", "MC/al/pos/pt/numtof", - "MC/all/pos/pt/numtof", - "MC/el/sum/pt/numtof", "MC/mu/sum/pt/numtof", "MC/pi/sum/pt/numtof", - "MC/ka/sum/pt/numtof", "MC/pr/sum/pt/numtof", "MC/de/sum/pt/numtof", - "MC/tr/sum/pt/numtof", "MC/he/sum/pt/numtof", "MC/al/sum/pt/numtof", - "MC/all/sum/pt/numtof"}; - static constexpr std::string_view hPtDen[nHistograms] = {"MC/el/sum/pt/den", "MC/mu/sum/pt/den", "MC/pi/sum/pt/den", - "MC/ka/sum/pt/den", "MC/pr/sum/pt/den", "MC/de/sum/pt/den", - "MC/tr/sum/pt/den", "MC/he/sum/pt/den", "MC/al/sum/pt/den", - "MC/all/sum/pt/den", - "MC/el/pos/pt/den", "MC/mu/pos/pt/den", "MC/pi/pos/pt/den", - "MC/ka/pos/pt/den", "MC/pr/pos/pt/den", "MC/de/pos/pt/den", - "MC/tr/pos/pt/den", "MC/he/pos/pt/den", "MC/al/pos/pt/den", - "MC/all/pos/pt/den", - "MC/el/neg/pt/den", "MC/mu/neg/pt/den", "MC/pi/neg/pt/den", - "MC/ka/neg/pt/den", "MC/pr/neg/pt/den", "MC/de/neg/pt/den", - "MC/tr/neg/pt/den", "MC/he/neg/pt/den", "MC/al/neg/pt/den", - "MC/all/neg/pt/den"}; + static constexpr std::string_view hPtIts[nHistograms] = {"MC/el/pos/pt/its", "MC/mu/pos/pt/its", "MC/pi/pos/pt/its", + "MC/ka/pos/pt/its", "MC/pr/pos/pt/its", "MC/de/pos/pt/its", + "MC/tr/pos/pt/its", "MC/he/pos/pt/its", "MC/al/pos/pt/its", + "MC/all/pos/pt/its", + "MC/el/neg/pt/its", "MC/mu/neg/pt/its", "MC/pi/neg/pt/its", + "MC/ka/neg/pt/its", "MC/pr/neg/pt/its", "MC/de/neg/pt/its", + "MC/tr/neg/pt/its", "MC/he/neg/pt/its", "MC/al/neg/pt/its", + "MC/all/neg/pt/its"}; + static constexpr std::string_view hPtTpc[nHistograms] = {"MC/el/pos/pt/tpc", "MC/mu/pos/pt/tpc", "MC/pi/pos/pt/tpc", + "MC/ka/pos/pt/tpc", "MC/pr/pos/pt/tpc", "MC/de/pos/pt/tpc", + "MC/tr/pos/pt/tpc", "MC/he/pos/pt/tpc", "MC/al/pos/pt/tpc", + "MC/all/pos/pt/tpc", + "MC/el/neg/pt/tpc", "MC/mu/neg/pt/tpc", "MC/pi/neg/pt/tpc", + "MC/ka/neg/pt/tpc", "MC/pr/neg/pt/tpc", "MC/de/neg/pt/tpc", + "MC/tr/neg/pt/tpc", "MC/he/neg/pt/tpc", "MC/al/neg/pt/tpc", + "MC/all/neg/pt/tpc"}; + static constexpr std::string_view hPtItsTpc[nHistograms] = {"MC/el/pos/pt/its_tpc", "MC/mu/pos/pt/its_tpc", "MC/pi/pos/pt/its_tpc", + "MC/ka/pos/pt/its_tpc", "MC/pr/pos/pt/its_tpc", "MC/de/pos/pt/its_tpc", + "MC/tr/pos/pt/its_tpc", "MC/he/pos/pt/its_tpc", "MC/al/pos/pt/its_tpc", + "MC/all/pos/pt/its_tpc", + "MC/el/neg/pt/its_tpc", "MC/mu/neg/pt/its_tpc", "MC/pi/neg/pt/its_tpc", + "MC/ka/neg/pt/its_tpc", "MC/pr/neg/pt/its_tpc", "MC/de/neg/pt/its_tpc", + "MC/tr/neg/pt/its_tpc", "MC/he/neg/pt/its_tpc", "MC/al/neg/pt/its_tpc", + "MC/all/neg/pt/its_tpc"}; + static constexpr std::string_view hPtItsTof[nHistograms] = {"MC/el/pos/pt/its_tof", "MC/mu/pos/pt/its_tof", "MC/pi/pos/pt/its_tof", + "MC/ka/pos/pt/its_tof", "MC/pr/pos/pt/its_tof", "MC/de/pos/pt/its_tof", + "MC/tr/pos/pt/its_tof", "MC/he/pos/pt/its_tof", "MC/al/pos/pt/its_tof", + "MC/all/pos/pt/its_tof", + "MC/el/neg/pt/its_tof", "MC/mu/neg/pt/its_tof", "MC/pi/neg/pt/its_tof", + "MC/ka/neg/pt/its_tof", "MC/pr/neg/pt/its_tof", "MC/de/neg/pt/its_tof", + "MC/tr/neg/pt/its_tof", "MC/he/neg/pt/its_tof", "MC/al/neg/pt/its_tof", + "MC/all/neg/pt/its_tof"}; + static constexpr std::string_view hPtTpcTof[nHistograms] = {"MC/el/pos/pt/tpc_tof", "MC/mu/pos/pt/tpc_tof", "MC/pi/pos/pt/tpc_tof", + "MC/ka/pos/pt/tpc_tof", "MC/pr/pos/pt/tpc_tof", "MC/de/pos/pt/tpc_tof", + "MC/tr/pos/pt/tpc_tof", "MC/he/pos/pt/tpc_tof", "MC/al/pos/pt/tpc_tof", + "MC/all/pos/pt/tpc_tof", + "MC/el/neg/pt/tpc_tof", "MC/mu/neg/pt/tpc_tof", "MC/pi/neg/pt/tpc_tof", + "MC/ka/neg/pt/tpc_tof", "MC/pr/neg/pt/tpc_tof", "MC/de/neg/pt/tpc_tof", + "MC/tr/neg/pt/tpc_tof", "MC/he/neg/pt/tpc_tof", "MC/al/neg/pt/tpc_tof", + "MC/all/neg/pt/tpc_tof"}; + static constexpr std::string_view hPtItsTpcTof[nHistograms] = {"MC/el/pos/pt/its_tpc_tof", "MC/mu/pos/pt/its_tpc_tof", "MC/pi/pos/pt/its_tpc_tof", + "MC/ka/pos/pt/its_tpc_tof", "MC/pr/pos/pt/its_tpc_tof", "MC/de/pos/pt/its_tpc_tof", + "MC/tr/pos/pt/its_tpc_tof", "MC/he/pos/pt/its_tpc_tof", "MC/al/pos/pt/its_tpc_tof", + "MC/all/pos/pt/its_tpc_tof", + "MC/el/neg/pt/its_tpc_tof", "MC/mu/neg/pt/its_tpc_tof", "MC/pi/neg/pt/its_tpc_tof", + "MC/ka/neg/pt/its_tpc_tof", "MC/pr/neg/pt/its_tpc_tof", "MC/de/neg/pt/its_tpc_tof", + "MC/tr/neg/pt/its_tpc_tof", "MC/he/neg/pt/its_tpc_tof", "MC/al/neg/pt/its_tpc_tof", + "MC/all/neg/pt/its_tpc_tof"}; + static constexpr std::string_view hPtTrkItsTpc[nHistograms] = {"MC/el/pos/pt/trk/its_tpc", "MC/mu/pos/pt/trk/its_tpc", "MC/pi/pos/pt/trk/its_tpc", + "MC/ka/pos/pt/trk/its_tpc", "MC/pr/pos/pt/trk/its_tpc", "MC/de/pos/pt/trk/its_tpc", + "MC/tr/pos/pt/trk/its_tpc", "MC/he/pos/pt/trk/its_tpc", "MC/al/pos/pt/trk/its_tpc", + "MC/all/pos/pt/trk/its_tpc", + "MC/el/neg/pt/trk/its_tpc", "MC/mu/neg/pt/trk/its_tpc", "MC/pi/neg/pt/trk/its_tpc", + "MC/ka/neg/pt/trk/its_tpc", "MC/pr/neg/pt/trk/its_tpc", "MC/de/neg/pt/trk/its_tpc", + "MC/tr/neg/pt/trk/its_tpc", "MC/he/neg/pt/trk/its_tpc", "MC/al/neg/pt/trk/its_tpc", + "MC/all/neg/pt/trk/its_tpc"}; + static constexpr std::string_view hPtGenerated[nHistograms] = {"MC/el/pos/pt/generated", "MC/mu/pos/pt/generated", "MC/pi/pos/pt/generated", + "MC/ka/pos/pt/generated", "MC/pr/pos/pt/generated", "MC/de/pos/pt/generated", + "MC/tr/pos/pt/generated", "MC/he/pos/pt/generated", "MC/al/pos/pt/generated", + "MC/all/pos/pt/generated", + "MC/el/neg/pt/generated", "MC/mu/neg/pt/generated", "MC/pi/neg/pt/generated", + "MC/ka/neg/pt/generated", "MC/pr/neg/pt/generated", "MC/de/neg/pt/generated", + "MC/tr/neg/pt/generated", "MC/he/neg/pt/generated", "MC/al/neg/pt/generated", + "MC/all/neg/pt/generated"}; + // Pt for primaries - static constexpr std::string_view hPtPrmNum[nHistograms] = {"MC/el/sum/prm/pt/num", "MC/mu/sum/prm/pt/num", "MC/pi/sum/prm/pt/num", - "MC/ka/sum/prm/pt/num", "MC/pr/sum/prm/pt/num", "MC/de/sum/prm/pt/num", - "MC/tr/sum/prm/pt/num", "MC/he/sum/prm/pt/num", "MC/al/sum/prm/pt/num", - "MC/all/sum/prm/pt/num", - "MC/el/pos/prm/pt/num", "MC/mu/pos/prm/pt/num", "MC/pi/pos/prm/pt/num", - "MC/ka/pos/prm/pt/num", "MC/pr/pos/prm/pt/num", "MC/de/pos/prm/pt/num", - "MC/tr/pos/prm/pt/num", "MC/he/pos/prm/pt/num", "MC/al/pos/prm/pt/num", - "MC/all/pos/prm/pt/num", - "MC/el/neg/prm/pt/num", "MC/mu/neg/prm/pt/num", "MC/pi/neg/prm/pt/num", - "MC/ka/neg/prm/pt/num", "MC/pr/neg/prm/pt/num", "MC/de/neg/prm/pt/num", - "MC/tr/neg/prm/pt/num", "MC/he/neg/prm/pt/num", "MC/al/neg/prm/pt/num", - "MC/all/neg/prm/pt/num"}; - static constexpr std::string_view hPtPrmNumTrk[nHistograms] = {"MC/el/sum/prm/pt/numtrk", "MC/mu/sum/prm/pt/numtrk", "MC/pi/sum/prm/pt/numtrk", - "MC/ka/sum/prm/pt/numtrk", "MC/pr/sum/prm/pt/numtrk", "MC/de/sum/prm/pt/numtrk", - "MC/tr/sum/prm/pt/numtrk", "MC/he/sum/prm/pt/numtrk", "MC/al/sum/prm/pt/numtrk", - "MC/all/sum/prm/pt/numtrk", - "MC/el/pos/prm/pt/numtrk", "MC/mu/pos/prm/pt/numtrk", "MC/pi/pos/prm/pt/numtrk", - "MC/ka/pos/prm/pt/numtrk", "MC/pr/pos/prm/pt/numtrk", "MC/de/pos/prm/pt/numtrk", - "MC/tr/pos/prm/pt/numtrk", "MC/he/pos/prm/pt/numtrk", "MC/al/pos/prm/pt/numtrk", - "MC/all/pos/prm/pt/numtrk", - "MC/el/neg/prm/pt/numtrk", "MC/mu/neg/prm/pt/numtrk", "MC/pi/neg/prm/pt/numtrk", - "MC/ka/neg/prm/pt/numtrk", "MC/pr/neg/prm/pt/numtrk", "MC/de/neg/prm/pt/numtrk", - "MC/tr/neg/prm/pt/numtrk", "MC/he/neg/prm/pt/numtrk", "MC/al/neg/prm/pt/numtrk", - "MC/all/neg/prm/pt/numtrk"}; - static constexpr std::string_view hPtPrmNumTof[nHistograms] = {"MC/el/sum/prm/pt/numtof", "MC/mu/sum/prm/pt/numtof", "MC/pi/sum/prm/pt/numtof", - "MC/ka/sum/prm/pt/numtof", "MC/pr/sum/prm/pt/numtof", "MC/de/sum/prm/pt/numtof", - "MC/tr/sum/prm/pt/numtof", "MC/he/sum/prm/pt/numtof", "MC/al/sum/prm/pt/numtof", - "MC/all/sum/prm/pt/numtof", - "MC/el/pos/prm/pt/numtof", "MC/mu/pos/prm/pt/numtof", "MC/pi/pos/prm/pt/numtof", - "MC/ka/pos/prm/pt/numtof", "MC/pr/pos/prm/pt/numtof", "MC/de/pos/prm/pt/numtof", - "MC/tr/pos/prm/pt/numtof", "MC/he/pos/prm/pt/numtof", "MC/al/pos/prm/pt/numtof", - "MC/all/pos/prm/pt/numtof", - "MC/el/neg/prm/pt/numtof", "MC/mu/neg/prm/pt/numtof", "MC/pi/neg/prm/pt/numtof", - "MC/ka/neg/prm/pt/numtof", "MC/pr/neg/prm/pt/numtof", "MC/de/neg/prm/pt/numtof", - "MC/tr/neg/prm/pt/numtof", "MC/he/neg/prm/pt/numtof", "MC/al/neg/prm/pt/numtof", - "MC/all/neg/prm/pt/numtof"}; - static constexpr std::string_view hPtPrmDen[nHistograms] = {"MC/el/sum/prm/pt/den", "MC/mu/sum/prm/pt/den", "MC/pi/sum/prm/pt/den", - "MC/ka/sum/prm/pt/den", "MC/pr/sum/prm/pt/den", "MC/de/sum/prm/pt/den", - "MC/tr/sum/prm/pt/den", "MC/he/sum/prm/pt/den", "MC/al/sum/prm/pt/den", - "MC/all/sum/prm/pt/den", - "MC/el/pos/prm/pt/den", "MC/mu/pos/prm/pt/den", "MC/pi/pos/prm/pt/den", - "MC/ka/pos/prm/pt/den", "MC/pr/pos/prm/pt/den", "MC/de/pos/prm/pt/den", - "MC/tr/pos/prm/pt/den", "MC/he/pos/prm/pt/den", "MC/al/pos/prm/pt/den", - "MC/all/pos/prm/pt/den", - "MC/el/neg/prm/pt/den", "MC/mu/neg/prm/pt/den", "MC/pi/neg/prm/pt/den", - "MC/ka/neg/prm/pt/den", "MC/pr/neg/prm/pt/den", "MC/de/neg/prm/pt/den", - "MC/tr/neg/prm/pt/den", "MC/he/neg/prm/pt/den", "MC/al/neg/prm/pt/den", - "MC/all/neg/prm/pt/den"}; + static constexpr std::string_view hPtItsPrm[nHistograms] = {"MC/el/pos/pt/prm/its", "MC/mu/pos/pt/prm/its", "MC/pi/pos/pt/prm/its", + "MC/ka/pos/pt/prm/its", "MC/pr/pos/pt/prm/its", "MC/de/pos/pt/prm/its", + "MC/tr/pos/pt/prm/its", "MC/he/pos/pt/prm/its", "MC/al/pos/pt/prm/its", + "MC/all/pos/pt/prm/its", + "MC/el/neg/pt/prm/its", "MC/mu/neg/pt/prm/its", "MC/pi/neg/pt/prm/its", + "MC/ka/neg/pt/prm/its", "MC/pr/neg/pt/prm/its", "MC/de/neg/pt/prm/its", + "MC/tr/neg/pt/prm/its", "MC/he/neg/pt/prm/its", "MC/al/neg/pt/prm/its", + "MC/all/neg/pt/prm/its"}; + static constexpr std::string_view hPtItsTpcPrm[nHistograms] = {"MC/el/pos/pt/prm/its_tpc", "MC/mu/pos/pt/prm/its_tpc", "MC/pi/pos/pt/prm/its_tpc", + "MC/ka/pos/pt/prm/its_tpc", "MC/pr/pos/pt/prm/its_tpc", "MC/de/pos/pt/prm/its_tpc", + "MC/tr/pos/pt/prm/its_tpc", "MC/he/pos/pt/prm/its_tpc", "MC/al/pos/pt/prm/its_tpc", + "MC/all/pos/pt/prm/its_tpc", + "MC/el/neg/pt/prm/its_tpc", "MC/mu/neg/pt/prm/its_tpc", "MC/pi/neg/pt/prm/its_tpc", + "MC/ka/neg/pt/prm/its_tpc", "MC/pr/neg/pt/prm/its_tpc", "MC/de/neg/pt/prm/its_tpc", + "MC/tr/neg/pt/prm/its_tpc", "MC/he/neg/pt/prm/its_tpc", "MC/al/neg/pt/prm/its_tpc", + "MC/all/neg/pt/prm/its_tpc"}; + static constexpr std::string_view hPtTrkItsTpcPrm[nHistograms] = {"MC/el/pos/pt/prm/trk/its_tpc", "MC/mu/pos/pt/prm/trk/its_tpc", "MC/pi/pos/pt/prm/trk/its_tpc", + "MC/ka/pos/pt/prm/trk/its_tpc", "MC/pr/pos/pt/prm/trk/its_tpc", "MC/de/pos/pt/prm/trk/its_tpc", + "MC/tr/pos/pt/prm/trk/its_tpc", "MC/he/pos/pt/prm/trk/its_tpc", "MC/al/pos/pt/prm/trk/its_tpc", + "MC/all/pos/pt/prm/trk/its_tpc", + "MC/el/neg/pt/prm/trk/its_tpc", "MC/mu/neg/pt/prm/trk/its_tpc", "MC/pi/neg/pt/prm/trk/its_tpc", + "MC/ka/neg/pt/prm/trk/its_tpc", "MC/pr/neg/pt/prm/trk/its_tpc", "MC/de/neg/pt/prm/trk/its_tpc", + "MC/tr/neg/pt/prm/trk/its_tpc", "MC/he/neg/pt/prm/trk/its_tpc", "MC/al/neg/pt/prm/trk/its_tpc", + "MC/all/neg/pt/prm/trk/its_tpc"}; + static constexpr std::string_view hPtItsTpcTofPrm[nHistograms] = {"MC/el/pos/pt/prm/its_tpc_tof", "MC/mu/pos/pt/prm/its_tpc_tof", "MC/pi/pos/pt/prm/its_tpc_tof", + "MC/ka/pos/pt/prm/its_tpc_tof", "MC/pr/pos/pt/prm/its_tpc_tof", "MC/de/pos/pt/prm/its_tpc_tof", + "MC/tr/pos/pt/prm/its_tpc_tof", "MC/he/pos/pt/prm/its_tpc_tof", "MC/al/pos/pt/prm/its_tpc_tof", + "MC/all/pos/pt/prm/its_tpc_tof", + "MC/el/neg/pt/prm/its_tpc_tof", "MC/mu/neg/pt/prm/its_tpc_tof", "MC/pi/neg/pt/prm/its_tpc_tof", + "MC/ka/neg/pt/prm/its_tpc_tof", "MC/pr/neg/pt/prm/its_tpc_tof", "MC/de/neg/pt/prm/its_tpc_tof", + "MC/tr/neg/pt/prm/its_tpc_tof", "MC/he/neg/pt/prm/its_tpc_tof", "MC/al/neg/pt/prm/its_tpc_tof", + "MC/all/neg/pt/prm/its_tpc_tof"}; + static constexpr std::string_view hPtGeneratedPrm[nHistograms] = {"MC/el/pos/pt/prm/generated", "MC/mu/pos/pt/prm/generated", "MC/pi/pos/pt/prm/generated", + "MC/ka/pos/pt/prm/generated", "MC/pr/pos/pt/prm/generated", "MC/de/pos/pt/prm/generated", + "MC/tr/pos/pt/prm/generated", "MC/he/pos/pt/prm/generated", "MC/al/pos/pt/prm/generated", + "MC/all/pos/pt/prm/generated", + "MC/el/neg/pt/prm/generated", "MC/mu/neg/pt/prm/generated", "MC/pi/neg/pt/prm/generated", + "MC/ka/neg/pt/prm/generated", "MC/pr/neg/pt/prm/generated", "MC/de/neg/pt/prm/generated", + "MC/tr/neg/pt/prm/generated", "MC/he/neg/pt/prm/generated", "MC/al/neg/pt/prm/generated", + "MC/all/neg/pt/prm/generated"}; + // Pt for secondaries from weak decay - static constexpr std::string_view hPtDecNum[nHistograms] = {"MC/el/sum/dec/pt/num", "MC/mu/sum/dec/pt/num", "MC/pi/sum/dec/pt/num", - "MC/ka/sum/dec/pt/num", "MC/pr/sum/dec/pt/num", "MC/de/sum/dec/pt/num", - "MC/tr/sum/dec/pt/num", "MC/he/sum/dec/pt/num", "MC/al/sum/dec/pt/num", - "MC/all/sum/dec/pt/num", - "MC/el/pos/dec/pt/num", "MC/mu/pos/dec/pt/num", "MC/pi/pos/dec/pt/num", - "MC/ka/pos/dec/pt/num", "MC/pr/pos/dec/pt/num", "MC/de/pos/dec/pt/num", - "MC/tr/pos/dec/pt/num", "MC/he/pos/dec/pt/num", "MC/al/pos/dec/pt/num", - "MC/all/pos/dec/pt/num", - "MC/el/neg/dec/pt/num", "MC/mu/neg/dec/pt/num", "MC/pi/neg/dec/pt/num", - "MC/ka/neg/dec/pt/num", "MC/pr/neg/dec/pt/num", "MC/de/neg/dec/pt/num", - "MC/tr/neg/dec/pt/num", "MC/he/neg/dec/pt/num", "MC/al/neg/dec/pt/num", - "MC/all/neg/dec/pt/num"}; - static constexpr std::string_view hPtDecNumTrk[nHistograms] = {"MC/el/sum/dec/pt/numtrk", "MC/mu/sum/dec/pt/numtrk", "MC/pi/sum/dec/pt/numtrk", - "MC/ka/sum/dec/pt/numtrk", "MC/pr/sum/dec/pt/numtrk", "MC/de/sum/dec/pt/numtrk", - "MC/tr/sum/dec/pt/numtrk", "MC/he/sum/dec/pt/numtrk", "MC/al/sum/dec/pt/numtrk", - "MC/all/sum/dec/pt/numtrk", - "MC/el/pos/dec/pt/numtrk", "MC/mu/pos/dec/pt/numtrk", "MC/pi/pos/dec/pt/numtrk", - "MC/ka/pos/dec/pt/numtrk", "MC/pr/pos/dec/pt/numtrk", "MC/de/pos/dec/pt/numtrk", - "MC/tr/pos/dec/pt/numtrk", "MC/he/pos/dec/pt/numtrk", "MC/al/pos/dec/pt/numtrk", - "MC/all/pos/dec/pt/numtrk", - "MC/el/neg/dec/pt/numtrk", "MC/mu/neg/dec/pt/numtrk", "MC/pi/neg/dec/pt/numtrk", - "MC/ka/neg/dec/pt/numtrk", "MC/pr/neg/dec/pt/numtrk", "MC/de/neg/dec/pt/numtrk", - "MC/tr/neg/dec/pt/numtrk", "MC/he/neg/dec/pt/numtrk", "MC/al/neg/dec/pt/numtrk", - "MC/all/neg/dec/pt/numtrk"}; - static constexpr std::string_view hPtDecNumTof[nHistograms] = {"MC/el/sum/dec/pt/numtof", "MC/mu/sum/dec/pt/numtof", "MC/pi/sum/dec/pt/numtof", - "MC/ka/sum/dec/pt/numtof", "MC/pr/sum/dec/pt/numtof", "MC/de/sum/dec/pt/numtof", - "MC/tr/sum/dec/pt/numtof", "MC/he/sum/dec/pt/numtof", "MC/al/sum/dec/pt/numtof", - "MC/all/sum/dec/pt/numtof", - "MC/el/pos/dec/pt/numtof", "MC/mu/pos/dec/pt/numtof", "MC/pi/pos/dec/pt/numtof", - "MC/ka/pos/dec/pt/numtof", "MC/pr/pos/dec/pt/numtof", "MC/de/pos/dec/pt/numtof", - "MC/tr/pos/dec/pt/numtof", "MC/he/pos/dec/pt/numtof", "MC/al/pos/dec/pt/numtof", - "MC/all/pos/dec/pt/numtof", - "MC/el/neg/dec/pt/numtof", "MC/mu/neg/dec/pt/numtof", "MC/pi/neg/dec/pt/numtof", - "MC/ka/neg/dec/pt/numtof", "MC/pr/neg/dec/pt/numtof", "MC/de/neg/dec/pt/numtof", - "MC/tr/neg/dec/pt/numtof", "MC/he/neg/dec/pt/numtof", "MC/al/neg/dec/pt/numtof", - "MC/all/neg/dec/pt/numtof"}; - static constexpr std::string_view hPtDecDen[nHistograms] = {"MC/el/sum/dec/pt/den", "MC/mu/sum/dec/pt/den", "MC/pi/sum/dec/pt/den", - "MC/ka/sum/dec/pt/den", "MC/pr/sum/dec/pt/den", "MC/de/sum/dec/pt/den", - "MC/tr/sum/dec/pt/den", "MC/he/sum/dec/pt/den", "MC/al/sum/dec/pt/den", - "MC/all/sum/dec/pt/den", - "MC/el/pos/dec/pt/den", "MC/mu/pos/dec/pt/den", "MC/pi/pos/dec/pt/den", - "MC/ka/pos/dec/pt/den", "MC/pr/pos/dec/pt/den", "MC/de/pos/dec/pt/den", - "MC/tr/pos/dec/pt/den", "MC/he/pos/dec/pt/den", "MC/al/pos/dec/pt/den", - "MC/all/pos/dec/pt/den", - "MC/el/neg/dec/pt/den", "MC/mu/neg/dec/pt/den", "MC/pi/neg/dec/pt/den", - "MC/ka/neg/dec/pt/den", "MC/pr/neg/dec/pt/den", "MC/de/neg/dec/pt/den", - "MC/tr/neg/dec/pt/den", "MC/he/neg/dec/pt/den", "MC/al/neg/dec/pt/den", - "MC/all/neg/dec/pt/den"}; + static constexpr std::string_view hPtItsTpcStr[nHistograms] = {"MC/el/pos/pt/str/its_tpc", "MC/mu/pos/pt/str/its_tpc", "MC/pi/pos/pt/str/its_tpc", + "MC/ka/pos/pt/str/its_tpc", "MC/pr/pos/pt/str/its_tpc", "MC/de/pos/pt/str/its_tpc", + "MC/tr/pos/pt/str/its_tpc", "MC/he/pos/pt/str/its_tpc", "MC/al/pos/pt/str/its_tpc", + "MC/all/pos/pt/str/its_tpc", + "MC/el/neg/pt/str/its_tpc", "MC/mu/neg/pt/str/its_tpc", "MC/pi/neg/pt/str/its_tpc", + "MC/ka/neg/pt/str/its_tpc", "MC/pr/neg/pt/str/its_tpc", "MC/de/neg/pt/str/its_tpc", + "MC/tr/neg/pt/str/its_tpc", "MC/he/neg/pt/str/its_tpc", "MC/al/neg/pt/str/its_tpc", + "MC/all/neg/pt/str/its_tpc"}; + static constexpr std::string_view hPtTrkItsTpcStr[nHistograms] = {"MC/el/pos/pt/str/trk/its_tpc", "MC/mu/pos/pt/str/trk/its_tpc", "MC/pi/pos/pt/str/trk/its_tpc", + "MC/ka/pos/pt/str/trk/its_tpc", "MC/pr/pos/pt/str/trk/its_tpc", "MC/de/pos/pt/str/trk/its_tpc", + "MC/tr/pos/pt/str/trk/its_tpc", "MC/he/pos/pt/str/trk/its_tpc", "MC/al/pos/pt/str/trk/its_tpc", + "MC/all/pos/pt/str/trk/its_tpc", + "MC/el/neg/pt/str/trk/its_tpc", "MC/mu/neg/pt/str/trk/its_tpc", "MC/pi/neg/pt/str/trk/its_tpc", + "MC/ka/neg/pt/str/trk/its_tpc", "MC/pr/neg/pt/str/trk/its_tpc", "MC/de/neg/pt/str/trk/its_tpc", + "MC/tr/neg/pt/str/trk/its_tpc", "MC/he/neg/pt/str/trk/its_tpc", "MC/al/neg/pt/str/trk/its_tpc", + "MC/all/neg/pt/str/trk/its_tpc"}; + static constexpr std::string_view hPtItsTpcTofStr[nHistograms] = {"MC/el/pos/pt/str/its_tpc_tof", "MC/mu/pos/pt/str/its_tpc_tof", "MC/pi/pos/pt/str/its_tpc_tof", + "MC/ka/pos/pt/str/its_tpc_tof", "MC/pr/pos/pt/str/its_tpc_tof", "MC/de/pos/pt/str/its_tpc_tof", + "MC/tr/pos/pt/str/its_tpc_tof", "MC/he/pos/pt/str/its_tpc_tof", "MC/al/pos/pt/str/its_tpc_tof", + "MC/all/pos/pt/str/its_tpc_tof", + "MC/el/neg/pt/str/its_tpc_tof", "MC/mu/neg/pt/str/its_tpc_tof", "MC/pi/neg/pt/str/its_tpc_tof", + "MC/ka/neg/pt/str/its_tpc_tof", "MC/pr/neg/pt/str/its_tpc_tof", "MC/de/neg/pt/str/its_tpc_tof", + "MC/tr/neg/pt/str/its_tpc_tof", "MC/he/neg/pt/str/its_tpc_tof", "MC/al/neg/pt/str/its_tpc_tof", + "MC/all/neg/pt/str/its_tpc_tof"}; + static constexpr std::string_view hPtGeneratedStr[nHistograms] = {"MC/el/pos/pt/str/generated", "MC/mu/pos/pt/str/generated", "MC/pi/pos/pt/str/generated", + "MC/ka/pos/pt/str/generated", "MC/pr/pos/pt/str/generated", "MC/de/pos/pt/str/generated", + "MC/tr/pos/pt/str/generated", "MC/he/pos/pt/str/generated", "MC/al/pos/pt/str/generated", + "MC/all/pos/pt/str/generated", + "MC/el/neg/pt/str/generated", "MC/mu/neg/pt/str/generated", "MC/pi/neg/pt/str/generated", + "MC/ka/neg/pt/str/generated", "MC/pr/neg/pt/str/generated", "MC/de/neg/pt/str/generated", + "MC/tr/neg/pt/str/generated", "MC/he/neg/pt/str/generated", "MC/al/neg/pt/str/generated", + "MC/all/neg/pt/str/generated"}; + // Pt for secondaries from material - static constexpr std::string_view hPtMatNum[nHistograms] = {"MC/el/sum/mat/pt/num", "MC/mu/sum/mat/pt/num", "MC/pi/sum/mat/pt/num", - "MC/ka/sum/mat/pt/num", "MC/pr/sum/mat/pt/num", "MC/de/sum/mat/pt/num", - "MC/tr/sum/mat/pt/num", "MC/he/sum/mat/pt/num", "MC/al/sum/mat/pt/num", - "MC/all/sum/mat/pt/num", - "MC/el/pos/mat/pt/num", "MC/mu/pos/mat/pt/num", "MC/pi/pos/mat/pt/num", - "MC/ka/pos/mat/pt/num", "MC/pr/pos/mat/pt/num", "MC/de/pos/mat/pt/num", - "MC/tr/pos/mat/pt/num", "MC/he/pos/mat/pt/num", "MC/al/pos/mat/pt/num", - "MC/all/pos/mat/pt/num", - "MC/el/neg/mat/pt/num", "MC/mu/neg/mat/pt/num", "MC/pi/neg/mat/pt/num", - "MC/ka/neg/mat/pt/num", "MC/pr/neg/mat/pt/num", "MC/de/neg/mat/pt/num", - "MC/tr/neg/mat/pt/num", "MC/he/neg/mat/pt/num", "MC/al/neg/mat/pt/num", - "MC/all/neg/mat/pt/num"}; - static constexpr std::string_view hPtMatNumTrk[nHistograms] = {"MC/el/sum/mat/pt/numtrk", "MC/mu/sum/mat/pt/numtrk", "MC/pi/sum/mat/pt/numtrk", - "MC/ka/sum/mat/pt/numtrk", "MC/pr/sum/mat/pt/numtrk", "MC/de/sum/mat/pt/numtrk", - "MC/tr/sum/mat/pt/numtrk", "MC/he/sum/mat/pt/numtrk", "MC/al/sum/mat/pt/numtrk", - "MC/all/sum/mat/pt/numtrk", - "MC/el/pos/mat/pt/numtrk", "MC/mu/pos/mat/pt/numtrk", "MC/pi/pos/mat/pt/numtrk", - "MC/ka/pos/mat/pt/numtrk", "MC/pr/pos/mat/pt/numtrk", "MC/de/pos/mat/pt/numtrk", - "MC/tr/pos/mat/pt/numtrk", "MC/he/pos/mat/pt/numtrk", "MC/al/pos/mat/pt/numtrk", - "MC/all/pos/mat/pt/numtrk", - "MC/el/neg/mat/pt/numtrk", "MC/mu/neg/mat/pt/numtrk", "MC/pi/neg/mat/pt/numtrk", - "MC/ka/neg/mat/pt/numtrk", "MC/pr/neg/mat/pt/numtrk", "MC/de/neg/mat/pt/numtrk", - "MC/tr/neg/mat/pt/numtrk", "MC/he/neg/mat/pt/numtrk", "MC/al/neg/mat/pt/numtrk", - "MC/all/neg/mat/pt/numtrk"}; - static constexpr std::string_view hPtMatNumTof[nHistograms] = {"MC/el/sum/mat/pt/numtof", "MC/mu/sum/mat/pt/numtof", "MC/pi/sum/mat/pt/numtof", - "MC/ka/sum/mat/pt/numtof", "MC/pr/sum/mat/pt/numtof", "MC/de/sum/mat/pt/numtof", - "MC/tr/sum/mat/pt/numtof", "MC/he/sum/mat/pt/numtof", "MC/al/sum/mat/pt/numtof", - "MC/all/sum/mat/pt/numtof", - "MC/el/pos/mat/pt/numtof", "MC/mu/pos/mat/pt/numtof", "MC/pi/pos/mat/pt/numtof", - "MC/ka/pos/mat/pt/numtof", "MC/pr/pos/mat/pt/numtof", "MC/de/pos/mat/pt/numtof", - "MC/tr/pos/mat/pt/numtof", "MC/he/pos/mat/pt/numtof", "MC/al/pos/mat/pt/numtof", - "MC/all/pos/mat/pt/numtof", - "MC/el/neg/mat/pt/numtof", "MC/mu/neg/mat/pt/numtof", "MC/pi/neg/mat/pt/numtof", - "MC/ka/neg/mat/pt/numtof", "MC/pr/neg/mat/pt/numtof", "MC/de/neg/mat/pt/numtof", - "MC/tr/neg/mat/pt/numtof", "MC/he/neg/mat/pt/numtof", "MC/al/neg/mat/pt/numtof", - "MC/all/neg/mat/pt/numtof"}; - static constexpr std::string_view hPtMatDen[nHistograms] = {"MC/el/sum/mat/pt/den", "MC/mu/sum/mat/pt/den", "MC/pi/sum/mat/pt/den", - "MC/ka/sum/mat/pt/den", "MC/pr/sum/mat/pt/den", "MC/de/sum/mat/pt/den", - "MC/tr/sum/mat/pt/den", "MC/he/sum/mat/pt/den", "MC/al/sum/mat/pt/den", - "MC/all/sum/mat/pt/den", - "MC/el/pos/mat/pt/den", "MC/mu/pos/mat/pt/den", "MC/pi/pos/mat/pt/den", - "MC/ka/pos/mat/pt/den", "MC/pr/pos/mat/pt/den", "MC/de/pos/mat/pt/den", - "MC/tr/pos/mat/pt/den", "MC/he/pos/mat/pt/den", "MC/al/pos/mat/pt/den", - "MC/all/pos/mat/pt/den", - "MC/el/neg/mat/pt/den", "MC/mu/neg/mat/pt/den", "MC/pi/neg/mat/pt/den", - "MC/ka/neg/mat/pt/den", "MC/pr/neg/mat/pt/den", "MC/de/neg/mat/pt/den", - "MC/tr/neg/mat/pt/den", "MC/he/neg/mat/pt/den", "MC/al/neg/mat/pt/den", - "MC/all/neg/mat/pt/den"}; + static constexpr std::string_view hPtItsTpcMat[nHistograms] = {"MC/el/pos/pt/mat/its_tpc", "MC/mu/pos/pt/mat/its_tpc", "MC/pi/pos/pt/mat/its_tpc", + "MC/ka/pos/pt/mat/its_tpc", "MC/pr/pos/pt/mat/its_tpc", "MC/de/pos/pt/mat/its_tpc", + "MC/tr/pos/pt/mat/its_tpc", "MC/he/pos/pt/mat/its_tpc", "MC/al/pos/pt/mat/its_tpc", + "MC/all/pos/pt/mat/its_tpc", + "MC/el/neg/pt/mat/its_tpc", "MC/mu/neg/pt/mat/its_tpc", "MC/pi/neg/pt/mat/its_tpc", + "MC/ka/neg/pt/mat/its_tpc", "MC/pr/neg/pt/mat/its_tpc", "MC/de/neg/pt/mat/its_tpc", + "MC/tr/neg/pt/mat/its_tpc", "MC/he/neg/pt/mat/its_tpc", "MC/al/neg/pt/mat/its_tpc", + "MC/all/neg/pt/mat/its_tpc"}; + static constexpr std::string_view hPtTrkItsTpcMat[nHistograms] = {"MC/el/pos/pt/mat/trk/its_tpc", "MC/mu/pos/pt/mat/trk/its_tpc", "MC/pi/pos/pt/mat/trk/its_tpc", + "MC/ka/pos/pt/mat/trk/its_tpc", "MC/pr/pos/pt/mat/trk/its_tpc", "MC/de/pos/pt/mat/trk/its_tpc", + "MC/tr/pos/pt/mat/trk/its_tpc", "MC/he/pos/pt/mat/trk/its_tpc", "MC/al/pos/pt/mat/trk/its_tpc", + "MC/all/pos/pt/mat/trk/its_tpc", + "MC/el/neg/pt/mat/trk/its_tpc", "MC/mu/neg/pt/mat/trk/its_tpc", "MC/pi/neg/pt/mat/trk/its_tpc", + "MC/ka/neg/pt/mat/trk/its_tpc", "MC/pr/neg/pt/mat/trk/its_tpc", "MC/de/neg/pt/mat/trk/its_tpc", + "MC/tr/neg/pt/mat/trk/its_tpc", "MC/he/neg/pt/mat/trk/its_tpc", "MC/al/neg/pt/mat/trk/its_tpc", + "MC/all/neg/pt/mat/trk/its_tpc"}; + static constexpr std::string_view hPtItsTpcTofMat[nHistograms] = {"MC/el/pos/pt/mat/its_tpc_tof", "MC/mu/pos/pt/mat/its_tpc_tof", "MC/pi/pos/pt/mat/its_tpc_tof", + "MC/ka/pos/pt/mat/its_tpc_tof", "MC/pr/pos/pt/mat/its_tpc_tof", "MC/de/pos/pt/mat/its_tpc_tof", + "MC/tr/pos/pt/mat/its_tpc_tof", "MC/he/pos/pt/mat/its_tpc_tof", "MC/al/pos/pt/mat/its_tpc_tof", + "MC/all/pos/pt/mat/its_tpc_tof", + "MC/el/neg/pt/mat/its_tpc_tof", "MC/mu/neg/pt/mat/its_tpc_tof", "MC/pi/neg/pt/mat/its_tpc_tof", + "MC/ka/neg/pt/mat/its_tpc_tof", "MC/pr/neg/pt/mat/its_tpc_tof", "MC/de/neg/pt/mat/its_tpc_tof", + "MC/tr/neg/pt/mat/its_tpc_tof", "MC/he/neg/pt/mat/its_tpc_tof", "MC/al/neg/pt/mat/its_tpc_tof", + "MC/all/neg/pt/mat/its_tpc_tof"}; + static constexpr std::string_view hPtGeneratedMat[nHistograms] = {"MC/el/pos/pt/mat/generated", "MC/mu/pos/pt/mat/generated", "MC/pi/pos/pt/mat/generated", + "MC/ka/pos/pt/mat/generated", "MC/pr/pos/pt/mat/generated", "MC/de/pos/pt/mat/generated", + "MC/tr/pos/pt/mat/generated", "MC/he/pos/pt/mat/generated", "MC/al/pos/pt/mat/generated", + "MC/all/pos/pt/mat/generated", + "MC/el/neg/pt/mat/generated", "MC/mu/neg/pt/mat/generated", "MC/pi/neg/pt/mat/generated", + "MC/ka/neg/pt/mat/generated", "MC/pr/neg/pt/mat/generated", "MC/de/neg/pt/mat/generated", + "MC/tr/neg/pt/mat/generated", "MC/he/neg/pt/mat/generated", "MC/al/neg/pt/mat/generated", + "MC/all/neg/pt/mat/generated"}; + // P - static constexpr std::string_view hPNum[nHistograms] = {"MC/el/sum/p/num", "MC/mu/sum/p/num", "MC/pi/sum/p/num", - "MC/ka/sum/p/num", "MC/pr/sum/p/num", "MC/de/sum/p/num", - "MC/tr/sum/p/num", "MC/he/sum/p/num", "MC/al/sum/p/num", - "MC/all/sum/p/num", - "MC/el/pos/p/num", "MC/mu/pos/p/num", "MC/pi/pos/p/num", - "MC/ka/pos/p/num", "MC/pr/pos/p/num", "MC/de/pos/p/num", - "MC/tr/pos/p/num", "MC/he/pos/p/num", "MC/al/pos/p/num", - "MC/all/pos/p/num", - "MC/el/neg/p/num", "MC/mu/neg/p/num", "MC/pi/neg/p/num", - "MC/ka/neg/p/num", "MC/pr/neg/p/num", "MC/de/neg/p/num", - "MC/tr/neg/p/num", "MC/he/neg/p/num", "MC/al/neg/p/num", - "MC/all/neg/p/num"}; - static constexpr std::string_view hPNumTrk[nHistograms] = {"MC/el/sum/p/numtrk", "MC/mu/sum/p/numtrk", "MC/pi/sum/p/numtrk", - "MC/ka/sum/p/numtrk", "MC/pr/sum/p/numtrk", "MC/de/sum/p/numtrk", - "MC/tr/sum/p/numtrk", "MC/he/sum/p/numtrk", "MC/al/sum/p/numtrk", - "MC/all/sum/p/numtrk", - "MC/el/pos/p/numtrk", "MC/mu/pos/p/numtrk", "MC/pi/pos/p/numtrk", - "MC/ka/pos/p/numtrk", "MC/pr/pos/p/numtrk", "MC/de/pos/p/numtrk", - "MC/tr/pos/p/numtrk", "MC/he/pos/p/numtrk", "MC/al/pos/p/numtrk", - "MC/all/pos/p/numtrk", - "MC/el/neg/p/numtrk", "MC/mu/neg/p/numtrk", "MC/pi/neg/p/numtrk", - "MC/ka/neg/p/numtrk", "MC/pr/neg/p/numtrk", "MC/de/neg/p/numtrk", - "MC/tr/neg/p/numtrk", "MC/he/neg/p/numtrk", "MC/al/neg/p/numtrk", - "MC/all/neg/p/numtrk"}; - static constexpr std::string_view hPNumTof[nHistograms] = {"MC/el/sum/p/numtof", "MC/mu/sum/p/numtof", "MC/pi/sum/p/numtof", - "MC/ka/sum/p/numtof", "MC/pr/sum/p/numtof", "MC/de/sum/p/numtof", - "MC/tr/sum/p/numtof", "MC/he/sum/p/numtof", "MC/al/sum/p/numtof", - "MC/all/sum/p/numtof", - "MC/el/pos/p/numtof", "MC/mu/pos/p/numtof", "MC/pi/pos/p/numtof", - "MC/ka/pos/p/numtof", "MC/pr/pos/p/numtof", "MC/de/pos/p/numtof", - "MC/tr/pos/p/numtof", "MC/he/pos/p/numtof", "MC/al/pos/p/numtof", - "MC/all/pos/p/numtof", - "MC/el/sum/p/numtof", "MC/mu/sum/p/numtof", "MC/pi/sum/p/numtof", - "MC/ka/sum/p/numtof", "MC/pr/sum/p/numtof", "MC/de/sum/p/numtof", - "MC/tr/sum/p/numtof", "MC/he/sum/p/numtof", "MC/al/sum/p/numtof", - "MC/all/sum/p/numtof"}; - static constexpr std::string_view hPDen[nHistograms] = {"MC/el/sum/p/den", "MC/mu/sum/p/den", "MC/pi/sum/p/den", - "MC/ka/sum/p/den", "MC/pr/sum/p/den", "MC/de/sum/p/den", - "MC/tr/sum/p/den", "MC/he/sum/p/den", "MC/al/sum/p/den", - "MC/all/sum/p/den", - "MC/el/pos/p/den", "MC/mu/pos/p/den", "MC/pi/pos/p/den", - "MC/ka/pos/p/den", "MC/pr/pos/p/den", "MC/de/pos/p/den", - "MC/tr/pos/p/den", "MC/he/pos/p/den", "MC/al/pos/p/den", - "MC/all/pos/p/den", - "MC/el/neg/p/den", "MC/mu/neg/p/den", "MC/pi/neg/p/den", - "MC/ka/neg/p/den", "MC/pr/neg/p/den", "MC/de/neg/p/den", - "MC/tr/neg/p/den", "MC/he/neg/p/den", "MC/al/neg/p/den", - "MC/all/neg/p/den"}; + static constexpr std::string_view hPItsTpc[nHistograms] = {"MC/el/pos/p/its_tpc", "MC/mu/pos/p/its_tpc", "MC/pi/pos/p/its_tpc", + "MC/ka/pos/p/its_tpc", "MC/pr/pos/p/its_tpc", "MC/de/pos/p/its_tpc", + "MC/tr/pos/p/its_tpc", "MC/he/pos/p/its_tpc", "MC/al/pos/p/its_tpc", + "MC/all/pos/p/its_tpc", + "MC/el/neg/p/its_tpc", "MC/mu/neg/p/its_tpc", "MC/pi/neg/p/its_tpc", + "MC/ka/neg/p/its_tpc", "MC/pr/neg/p/its_tpc", "MC/de/neg/p/its_tpc", + "MC/tr/neg/p/its_tpc", "MC/he/neg/p/its_tpc", "MC/al/neg/p/its_tpc", + "MC/all/neg/p/its_tpc"}; + static constexpr std::string_view hPTrkItsTpc[nHistograms] = {"MC/el/pos/p/trk/its_tpc", "MC/mu/pos/p/trk/its_tpc", "MC/pi/pos/p/trk/its_tpc", + "MC/ka/pos/p/trk/its_tpc", "MC/pr/pos/p/trk/its_tpc", "MC/de/pos/p/trk/its_tpc", + "MC/tr/pos/p/trk/its_tpc", "MC/he/pos/p/trk/its_tpc", "MC/al/pos/p/trk/its_tpc", + "MC/all/pos/p/trk/its_tpc", + "MC/el/neg/p/trk/its_tpc", "MC/mu/neg/p/trk/its_tpc", "MC/pi/neg/p/trk/its_tpc", + "MC/ka/neg/p/trk/its_tpc", "MC/pr/neg/p/trk/its_tpc", "MC/de/neg/p/trk/its_tpc", + "MC/tr/neg/p/trk/its_tpc", "MC/he/neg/p/trk/its_tpc", "MC/al/neg/p/trk/its_tpc", + "MC/all/neg/p/trk/its_tpc"}; + static constexpr std::string_view hPItsTpcTof[nHistograms] = {"MC/el/pos/p/its_tpc_tof", "MC/mu/pos/p/its_tpc_tof", "MC/pi/pos/p/its_tpc_tof", + "MC/ka/pos/p/its_tpc_tof", "MC/pr/pos/p/its_tpc_tof", "MC/de/pos/p/its_tpc_tof", + "MC/tr/pos/p/its_tpc_tof", "MC/he/pos/p/its_tpc_tof", "MC/al/pos/p/its_tpc_tof", + "MC/all/pos/p/its_tpc_tof", + "MC/el/neg/p/its_tpc_tof", "MC/mu/neg/p/its_tpc_tof", "MC/pi/neg/p/its_tpc_tof", + "MC/ka/neg/p/its_tpc_tof", "MC/pr/neg/p/its_tpc_tof", "MC/de/neg/p/its_tpc_tof", + "MC/tr/neg/p/its_tpc_tof", "MC/he/neg/p/its_tpc_tof", "MC/al/neg/p/its_tpc_tof", + "MC/all/neg/p/its_tpc_tof"}; + static constexpr std::string_view hPGenerated[nHistograms] = {"MC/el/pos/p/generated", "MC/mu/pos/p/generated", "MC/pi/pos/p/generated", + "MC/ka/pos/p/generated", "MC/pr/pos/p/generated", "MC/de/pos/p/generated", + "MC/tr/pos/p/generated", "MC/he/pos/p/generated", "MC/al/pos/p/generated", + "MC/all/pos/p/generated", + "MC/el/neg/p/generated", "MC/mu/neg/p/generated", "MC/pi/neg/p/generated", + "MC/ka/neg/p/generated", "MC/pr/neg/p/generated", "MC/de/neg/p/generated", + "MC/tr/neg/p/generated", "MC/he/neg/p/generated", "MC/al/neg/p/generated", + "MC/all/neg/p/generated"}; + // Eta - static constexpr std::string_view hEtaNum[nHistograms] = {"MC/el/sum/eta/num", "MC/mu/sum/eta/num", "MC/pi/sum/eta/num", - "MC/ka/sum/eta/num", "MC/pr/sum/eta/num", "MC/de/sum/eta/num", - "MC/tr/sum/eta/num", "MC/he/sum/eta/num", "MC/al/sum/eta/num", - "MC/all/sum/eta/num", - "MC/el/pos/eta/num", "MC/mu/pos/eta/num", "MC/pi/pos/eta/num", - "MC/ka/pos/eta/num", "MC/pr/pos/eta/num", "MC/de/pos/eta/num", - "MC/tr/pos/eta/num", "MC/he/pos/eta/num", "MC/al/pos/eta/num", - "MC/all/pos/eta/num", - "MC/el/neg/eta/num", "MC/mu/neg/eta/num", "MC/pi/neg/eta/num", - "MC/ka/neg/eta/num", "MC/pr/neg/eta/num", "MC/de/neg/eta/num", - "MC/tr/neg/eta/num", "MC/he/neg/eta/num", "MC/al/neg/eta/num", - "MC/all/neg/eta/num"}; - static constexpr std::string_view hEtaNumTrk[nHistograms] = {"MC/el/sum/eta/numtrk", "MC/mu/sum/eta/numtrk", "MC/pi/sum/eta/numtrk", - "MC/ka/sum/eta/numtrk", "MC/pr/sum/eta/numtrk", "MC/de/sum/eta/numtrk", - "MC/tr/sum/eta/numtrk", "MC/he/sum/eta/numtrk", "MC/al/sum/eta/numtrk", - "MC/all/sum/eta/numtrk", - "MC/el/pos/eta/numtrk", "MC/mu/pos/eta/numtrk", "MC/pi/pos/eta/numtrk", - "MC/ka/pos/eta/numtrk", "MC/pr/pos/eta/numtrk", "MC/de/pos/eta/numtrk", - "MC/tr/pos/eta/numtrk", "MC/he/pos/eta/numtrk", "MC/al/pos/eta/numtrk", - "MC/all/pos/eta/numtrk", - "MC/el/neg/eta/numtrk", "MC/mu/neg/eta/numtrk", "MC/pi/neg/eta/numtrk", - "MC/ka/neg/eta/numtrk", "MC/pr/neg/eta/numtrk", "MC/de/neg/eta/numtrk", - "MC/tr/neg/eta/numtrk", "MC/he/neg/eta/numtrk", "MC/al/neg/eta/numtrk", - "MC/all/neg/eta/numtrk"}; - static constexpr std::string_view hEtaNumTof[nHistograms] = {"MC/el/sum/eta/numtof", "MC/mu/sum/eta/numtof", "MC/pi/sum/eta/numtof", - "MC/ka/sum/eta/numtof", "MC/pr/sum/eta/numtof", "MC/de/sum/eta/numtof", - "MC/tr/sum/eta/numtof", "MC/he/sum/eta/numtof", "MC/al/sum/eta/numtof", - "MC/all/sum/eta/numtof", - "MC/el/pos/eta/numtof", "MC/mu/pos/eta/numtof", "MC/pi/pos/eta/numtof", - "MC/ka/pos/eta/numtof", "MC/pr/pos/eta/numtof", "MC/de/pos/eta/numtof", - "MC/tr/pos/eta/numtof", "MC/he/pos/eta/numtof", "MC/al/pos/eta/numtof", - "MC/all/pos/eta/numtof", - "MC/el/sum/eta/numtof", "MC/mu/sum/eta/numtof", "MC/pi/sum/eta/numtof", - "MC/ka/sum/eta/numtof", "MC/pr/sum/eta/numtof", "MC/de/sum/eta/numtof", - "MC/tr/sum/eta/numtof", "MC/he/sum/eta/numtof", "MC/al/sum/eta/numtof", - "MC/all/sum/eta/numtof"}; - static constexpr std::string_view hEtaDen[nHistograms] = {"MC/el/sum/eta/den", "MC/mu/sum/eta/den", "MC/pi/sum/eta/den", - "MC/ka/sum/eta/den", "MC/pr/sum/eta/den", "MC/de/sum/eta/den", - "MC/tr/sum/eta/den", "MC/he/sum/eta/den", "MC/al/sum/eta/den", - "MC/all/sum/eta/den", - "MC/el/pos/eta/den", "MC/mu/pos/eta/den", "MC/pi/pos/eta/den", - "MC/ka/pos/eta/den", "MC/pr/pos/eta/den", "MC/de/pos/eta/den", - "MC/tr/pos/eta/den", "MC/he/pos/eta/den", "MC/al/pos/eta/den", - "MC/all/pos/eta/den", - "MC/el/neg/eta/den", "MC/mu/neg/eta/den", "MC/pi/neg/eta/den", - "MC/ka/neg/eta/den", "MC/pr/neg/eta/den", "MC/de/neg/eta/den", - "MC/tr/neg/eta/den", "MC/he/neg/eta/den", "MC/al/neg/eta/den", - "MC/all/neg/eta/den"}; + static constexpr std::string_view hEtaItsTpc[nHistograms] = {"MC/el/pos/eta/its_tpc", "MC/mu/pos/eta/its_tpc", "MC/pi/pos/eta/its_tpc", + "MC/ka/pos/eta/its_tpc", "MC/pr/pos/eta/its_tpc", "MC/de/pos/eta/its_tpc", + "MC/tr/pos/eta/its_tpc", "MC/he/pos/eta/its_tpc", "MC/al/pos/eta/its_tpc", + "MC/all/pos/eta/its_tpc", + "MC/el/neg/eta/its_tpc", "MC/mu/neg/eta/its_tpc", "MC/pi/neg/eta/its_tpc", + "MC/ka/neg/eta/its_tpc", "MC/pr/neg/eta/its_tpc", "MC/de/neg/eta/its_tpc", + "MC/tr/neg/eta/its_tpc", "MC/he/neg/eta/its_tpc", "MC/al/neg/eta/its_tpc", + "MC/all/neg/eta/its_tpc"}; + static constexpr std::string_view hEtaTrkItsTpc[nHistograms] = {"MC/el/pos/eta/trk/its_tpc", "MC/mu/pos/eta/trk/its_tpc", "MC/pi/pos/eta/trk/its_tpc", + "MC/ka/pos/eta/trk/its_tpc", "MC/pr/pos/eta/trk/its_tpc", "MC/de/pos/eta/trk/its_tpc", + "MC/tr/pos/eta/trk/its_tpc", "MC/he/pos/eta/trk/its_tpc", "MC/al/pos/eta/trk/its_tpc", + "MC/all/pos/eta/trk/its_tpc", + "MC/el/neg/eta/trk/its_tpc", "MC/mu/neg/eta/trk/its_tpc", "MC/pi/neg/eta/trk/its_tpc", + "MC/ka/neg/eta/trk/its_tpc", "MC/pr/neg/eta/trk/its_tpc", "MC/de/neg/eta/trk/its_tpc", + "MC/tr/neg/eta/trk/its_tpc", "MC/he/neg/eta/trk/its_tpc", "MC/al/neg/eta/trk/its_tpc", + "MC/all/neg/eta/trk/its_tpc"}; + static constexpr std::string_view hEtaItsTpcTof[nHistograms] = {"MC/el/pos/eta/its_tpc_tof", "MC/mu/pos/eta/its_tpc_tof", "MC/pi/pos/eta/its_tpc_tof", + "MC/ka/pos/eta/its_tpc_tof", "MC/pr/pos/eta/its_tpc_tof", "MC/de/pos/eta/its_tpc_tof", + "MC/tr/pos/eta/its_tpc_tof", "MC/he/pos/eta/its_tpc_tof", "MC/al/pos/eta/its_tpc_tof", + "MC/all/pos/eta/its_tpc_tof", + "MC/el/neg/eta/its_tpc_tof", "MC/mu/neg/eta/its_tpc_tof", "MC/pi/neg/eta/its_tpc_tof", + "MC/ka/neg/eta/its_tpc_tof", "MC/pr/neg/eta/its_tpc_tof", "MC/de/neg/eta/its_tpc_tof", + "MC/tr/neg/eta/its_tpc_tof", "MC/he/neg/eta/its_tpc_tof", "MC/al/neg/eta/its_tpc_tof", + "MC/all/neg/eta/its_tpc_tof"}; + static constexpr std::string_view hEtaGenerated[nHistograms] = {"MC/el/pos/eta/generated", "MC/mu/pos/eta/generated", "MC/pi/pos/eta/generated", + "MC/ka/pos/eta/generated", "MC/pr/pos/eta/generated", "MC/de/pos/eta/generated", + "MC/tr/pos/eta/generated", "MC/he/pos/eta/generated", "MC/al/pos/eta/generated", + "MC/all/pos/eta/generated", + "MC/el/neg/eta/generated", "MC/mu/neg/eta/generated", "MC/pi/neg/eta/generated", + "MC/ka/neg/eta/generated", "MC/pr/neg/eta/generated", "MC/de/neg/eta/generated", + "MC/tr/neg/eta/generated", "MC/he/neg/eta/generated", "MC/al/neg/eta/generated", + "MC/all/neg/eta/generated"}; + // Y - static constexpr std::string_view hYNum[nHistograms] = {"MC/el/sum/y/num", "MC/mu/sum/y/num", "MC/pi/sum/y/num", - "MC/ka/sum/y/num", "MC/pr/sum/y/num", "MC/de/sum/y/num", - "MC/tr/sum/y/num", "MC/he/sum/y/num", "MC/al/sum/y/num", - "MC/all/sum/y/num", - "MC/el/pos/y/num", "MC/mu/pos/y/num", "MC/pi/pos/y/num", - "MC/ka/pos/y/num", "MC/pr/pos/y/num", "MC/de/pos/y/num", - "MC/tr/pos/y/num", "MC/he/pos/y/num", "MC/al/pos/y/num", - "MC/all/pos/y/num", - "MC/el/neg/y/num", "MC/mu/neg/y/num", "MC/pi/neg/y/num", - "MC/ka/neg/y/num", "MC/pr/neg/y/num", "MC/de/neg/y/num", - "MC/tr/neg/y/num", "MC/he/neg/y/num", "MC/al/neg/y/num", - "MC/all/neg/y/num"}; - static constexpr std::string_view hYNumTof[nHistograms] = {"MC/el/sum/y/numtof", "MC/mu/sum/y/numtof", "MC/pi/sum/y/numtof", - "MC/ka/sum/y/numtof", "MC/pr/sum/y/numtof", "MC/de/sum/y/numtof", - "MC/tr/sum/y/numtof", "MC/he/sum/y/numtof", "MC/al/sum/y/numtof", - "MC/all/sum/y/numtof", - "MC/el/pos/y/numtof", "MC/mu/pos/y/numtof", "MC/pi/pos/y/numtof", - "MC/ka/pos/y/numtof", "MC/pr/pos/y/numtof", "MC/de/pos/y/numtof", - "MC/tr/pos/y/numtof", "MC/he/pos/y/numtof", "MC/al/pos/y/numtof", - "MC/all/pos/y/numtof", - "MC/el/sum/y/numtof", "MC/mu/sum/y/numtof", "MC/pi/sum/y/numtof", - "MC/ka/sum/y/numtof", "MC/pr/sum/y/numtof", "MC/de/sum/y/numtof", - "MC/tr/sum/y/numtof", "MC/he/sum/y/numtof", "MC/al/sum/y/numtof", - "MC/all/sum/y/numtof"}; - static constexpr std::string_view hYDen[nHistograms] = {"MC/el/sum/y/den", "MC/mu/sum/y/den", "MC/pi/sum/y/den", - "MC/ka/sum/y/den", "MC/pr/sum/y/den", "MC/de/sum/y/den", - "MC/tr/sum/y/den", "MC/he/sum/y/den", "MC/al/sum/y/den", - "MC/all/sum/y/den", - "MC/el/pos/y/den", "MC/mu/pos/y/den", "MC/pi/pos/y/den", - "MC/ka/pos/y/den", "MC/pr/pos/y/den", "MC/de/pos/y/den", - "MC/tr/pos/y/den", "MC/he/pos/y/den", "MC/al/pos/y/den", - "MC/all/pos/y/den", - "MC/el/neg/y/den", "MC/mu/neg/y/den", "MC/pi/neg/y/den", - "MC/ka/neg/y/den", "MC/pr/neg/y/den", "MC/de/neg/y/den", - "MC/tr/neg/y/den", "MC/he/neg/y/den", "MC/al/neg/y/den", - "MC/all/neg/y/den"}; + static constexpr std::string_view hYItsTpc[nHistograms] = {"MC/el/pos/y/its_tpc", "MC/mu/pos/y/its_tpc", "MC/pi/pos/y/its_tpc", + "MC/ka/pos/y/its_tpc", "MC/pr/pos/y/its_tpc", "MC/de/pos/y/its_tpc", + "MC/tr/pos/y/its_tpc", "MC/he/pos/y/its_tpc", "MC/al/pos/y/its_tpc", + "MC/all/pos/y/its_tpc", + "MC/el/neg/y/its_tpc", "MC/mu/neg/y/its_tpc", "MC/pi/neg/y/its_tpc", + "MC/ka/neg/y/its_tpc", "MC/pr/neg/y/its_tpc", "MC/de/neg/y/its_tpc", + "MC/tr/neg/y/its_tpc", "MC/he/neg/y/its_tpc", "MC/al/neg/y/its_tpc", + "MC/all/neg/y/its_tpc"}; + static constexpr std::string_view hYItsTpcTof[nHistograms] = {"MC/el/pos/y/its_tpc_tof", "MC/mu/pos/y/its_tpc_tof", "MC/pi/pos/y/its_tpc_tof", + "MC/ka/pos/y/its_tpc_tof", "MC/pr/pos/y/its_tpc_tof", "MC/de/pos/y/its_tpc_tof", + "MC/tr/pos/y/its_tpc_tof", "MC/he/pos/y/its_tpc_tof", "MC/al/pos/y/its_tpc_tof", + "MC/all/pos/y/its_tpc_tof", + "MC/el/neg/y/its_tpc_tof", "MC/mu/neg/y/its_tpc_tof", "MC/pi/neg/y/its_tpc_tof", + "MC/ka/neg/y/its_tpc_tof", "MC/pr/neg/y/its_tpc_tof", "MC/de/neg/y/its_tpc_tof", + "MC/tr/neg/y/its_tpc_tof", "MC/he/neg/y/its_tpc_tof", "MC/al/neg/y/its_tpc_tof", + "MC/all/neg/y/its_tpc_tof"}; + static constexpr std::string_view hYGenerated[nHistograms] = {"MC/el/pos/y/generated", "MC/mu/pos/y/generated", "MC/pi/pos/y/generated", + "MC/ka/pos/y/generated", "MC/pr/pos/y/generated", "MC/de/pos/y/generated", + "MC/tr/pos/y/generated", "MC/he/pos/y/generated", "MC/al/pos/y/generated", + "MC/all/pos/y/generated", + "MC/el/neg/y/generated", "MC/mu/neg/y/generated", "MC/pi/neg/y/generated", + "MC/ka/neg/y/generated", "MC/pr/neg/y/generated", "MC/de/neg/y/generated", + "MC/tr/neg/y/generated", "MC/he/neg/y/generated", "MC/al/neg/y/generated", + "MC/all/neg/y/generated"}; + // Phi - static constexpr std::string_view hPhiNum[nHistograms] = {"MC/el/sum/phi/num", "MC/mu/sum/phi/num", "MC/pi/sum/phi/num", - "MC/ka/sum/phi/num", "MC/pr/sum/phi/num", "MC/de/sum/phi/num", - "MC/tr/sum/phi/num", "MC/he/sum/phi/num", "MC/al/sum/phi/num", - "MC/all/sum/phi/num", - "MC/el/pos/phi/num", "MC/mu/pos/phi/num", "MC/pi/pos/phi/num", - "MC/ka/pos/phi/num", "MC/pr/pos/phi/num", "MC/de/pos/phi/num", - "MC/tr/pos/phi/num", "MC/he/pos/phi/num", "MC/al/pos/phi/num", - "MC/all/pos/phi/num", - "MC/el/neg/phi/num", "MC/mu/neg/phi/num", "MC/pi/neg/phi/num", - "MC/ka/neg/phi/num", "MC/pr/neg/phi/num", "MC/de/neg/phi/num", - "MC/tr/neg/phi/num", "MC/he/neg/phi/num", "MC/al/neg/phi/num", - "MC/all/neg/phi/num"}; - static constexpr std::string_view hPhiNumTrk[nHistograms] = {"MC/el/sum/phi/numtrk", "MC/mu/sum/phi/numtrk", "MC/pi/sum/phi/numtrk", - "MC/ka/sum/phi/numtrk", "MC/pr/sum/phi/numtrk", "MC/de/sum/phi/numtrk", - "MC/tr/sum/phi/numtrk", "MC/he/sum/phi/numtrk", "MC/al/sum/phi/numtrk", - "MC/all/sum/phi/numtrk", - "MC/el/pos/phi/numtrk", "MC/mu/pos/phi/numtrk", "MC/pi/pos/phi/numtrk", - "MC/ka/pos/phi/numtrk", "MC/pr/pos/phi/numtrk", "MC/de/pos/phi/numtrk", - "MC/tr/pos/phi/numtrk", "MC/he/pos/phi/numtrk", "MC/al/pos/phi/numtrk", - "MC/all/pos/phi/numtrk", - "MC/el/neg/phi/numtrk", "MC/mu/neg/phi/numtrk", "MC/pi/neg/phi/numtrk", - "MC/ka/neg/phi/numtrk", "MC/pr/neg/phi/numtrk", "MC/de/neg/phi/numtrk", - "MC/tr/neg/phi/numtrk", "MC/he/neg/phi/numtrk", "MC/al/neg/phi/numtrk", - "MC/all/neg/phi/numtrk"}; - static constexpr std::string_view hPhiNumTof[nHistograms] = {"MC/el/sum/phi/numtof", "MC/mu/sum/phi/numtof", "MC/pi/sum/phi/numtof", - "MC/ka/sum/phi/numtof", "MC/pr/sum/phi/numtof", "MC/de/sum/phi/numtof", - "MC/tr/sum/phi/numtof", "MC/he/sum/phi/numtof", "MC/al/sum/phi/numtof", - "MC/all/sum/phi/numtof", - "MC/el/pos/phi/numtof", "MC/mu/pos/phi/numtof", "MC/pi/pos/phi/numtof", - "MC/ka/pos/phi/numtof", "MC/pr/pos/phi/numtof", "MC/de/pos/phi/numtof", - "MC/tr/pos/phi/numtof", "MC/he/pos/phi/numtof", "MC/al/pos/phi/numtof", - "MC/all/pos/phi/numtof", - "MC/el/sum/phi/numtof", "MC/mu/sum/phi/numtof", "MC/pi/sum/phi/numtof", - "MC/ka/sum/phi/numtof", "MC/pr/sum/phi/numtof", "MC/de/sum/phi/numtof", - "MC/tr/sum/phi/numtof", "MC/he/sum/phi/numtof", "MC/al/sum/phi/numtof", - "MC/all/sum/phi/numtof"}; - static constexpr std::string_view hPhiDen[nHistograms] = {"MC/el/sum/phi/den", "MC/mu/sum/phi/den", "MC/pi/sum/phi/den", - "MC/ka/sum/phi/den", "MC/pr/sum/phi/den", "MC/de/sum/phi/den", - "MC/tr/sum/phi/den", "MC/he/sum/phi/den", "MC/al/sum/phi/den", - "MC/all/sum/phi/den", - "MC/el/pos/phi/den", "MC/mu/pos/phi/den", "MC/pi/pos/phi/den", - "MC/ka/pos/phi/den", "MC/pr/pos/phi/den", "MC/de/pos/phi/den", - "MC/tr/pos/phi/den", "MC/he/pos/phi/den", "MC/al/pos/phi/den", - "MC/all/pos/phi/den", - "MC/el/neg/phi/den", "MC/mu/neg/phi/den", "MC/pi/neg/phi/den", - "MC/ka/neg/phi/den", "MC/pr/neg/phi/den", "MC/de/neg/phi/den", - "MC/tr/neg/phi/den", "MC/he/neg/phi/den", "MC/al/neg/phi/den", - "MC/all/neg/phi/den"}; + static constexpr std::string_view hPhiItsTpc[nHistograms] = {"MC/el/pos/phi/its_tpc", "MC/mu/pos/phi/its_tpc", "MC/pi/pos/phi/its_tpc", + "MC/ka/pos/phi/its_tpc", "MC/pr/pos/phi/its_tpc", "MC/de/pos/phi/its_tpc", + "MC/tr/pos/phi/its_tpc", "MC/he/pos/phi/its_tpc", "MC/al/pos/phi/its_tpc", + "MC/all/pos/phi/its_tpc", + "MC/el/neg/phi/its_tpc", "MC/mu/neg/phi/its_tpc", "MC/pi/neg/phi/its_tpc", + "MC/ka/neg/phi/its_tpc", "MC/pr/neg/phi/its_tpc", "MC/de/neg/phi/its_tpc", + "MC/tr/neg/phi/its_tpc", "MC/he/neg/phi/its_tpc", "MC/al/neg/phi/its_tpc", + "MC/all/neg/phi/its_tpc"}; + static constexpr std::string_view hPhiTrkItsTpc[nHistograms] = {"MC/el/pos/phi/trk/its_tpc", "MC/mu/pos/phi/trk/its_tpc", "MC/pi/pos/phi/trk/its_tpc", + "MC/ka/pos/phi/trk/its_tpc", "MC/pr/pos/phi/trk/its_tpc", "MC/de/pos/phi/trk/its_tpc", + "MC/tr/pos/phi/trk/its_tpc", "MC/he/pos/phi/trk/its_tpc", "MC/al/pos/phi/trk/its_tpc", + "MC/all/pos/phi/trk/its_tpc", + "MC/el/neg/phi/trk/its_tpc", "MC/mu/neg/phi/trk/its_tpc", "MC/pi/neg/phi/trk/its_tpc", + "MC/ka/neg/phi/trk/its_tpc", "MC/pr/neg/phi/trk/its_tpc", "MC/de/neg/phi/trk/its_tpc", + "MC/tr/neg/phi/trk/its_tpc", "MC/he/neg/phi/trk/its_tpc", "MC/al/neg/phi/trk/its_tpc", + "MC/all/neg/phi/trk/its_tpc"}; + static constexpr std::string_view hPhiItsTpcTof[nHistograms] = {"MC/el/pos/phi/its_tpc_tof", "MC/mu/pos/phi/its_tpc_tof", "MC/pi/pos/phi/its_tpc_tof", + "MC/ka/pos/phi/its_tpc_tof", "MC/pr/pos/phi/its_tpc_tof", "MC/de/pos/phi/its_tpc_tof", + "MC/tr/pos/phi/its_tpc_tof", "MC/he/pos/phi/its_tpc_tof", "MC/al/pos/phi/its_tpc_tof", + "MC/all/pos/phi/its_tpc_tof", + "MC/el/neg/phi/its_tpc_tof", "MC/mu/neg/phi/its_tpc_tof", "MC/pi/neg/phi/its_tpc_tof", + "MC/ka/neg/phi/its_tpc_tof", "MC/pr/neg/phi/its_tpc_tof", "MC/de/neg/phi/its_tpc_tof", + "MC/tr/neg/phi/its_tpc_tof", "MC/he/neg/phi/its_tpc_tof", "MC/al/neg/phi/its_tpc_tof", + "MC/all/neg/phi/its_tpc_tof"}; + static constexpr std::string_view hPhiGenerated[nHistograms] = {"MC/el/pos/phi/generated", "MC/mu/pos/phi/generated", "MC/pi/pos/phi/generated", + "MC/ka/pos/phi/generated", "MC/pr/pos/phi/generated", "MC/de/pos/phi/generated", + "MC/tr/pos/phi/generated", "MC/he/pos/phi/generated", "MC/al/pos/phi/generated", + "MC/all/pos/phi/generated", + "MC/el/neg/phi/generated", "MC/mu/neg/phi/generated", "MC/pi/neg/phi/generated", + "MC/ka/neg/phi/generated", "MC/pr/neg/phi/generated", "MC/de/neg/phi/generated", + "MC/tr/neg/phi/generated", "MC/he/neg/phi/generated", "MC/al/neg/phi/generated", + "MC/all/neg/phi/generated"}; + // Pt-Eta - static constexpr std::string_view hPtEtaNum[nHistograms] = {"MC/el/sum/pteta/num", "MC/mu/sum/pteta/num", "MC/pi/sum/pteta/num", - "MC/ka/sum/pteta/num", "MC/pr/sum/pteta/num", "MC/de/sum/pteta/num", - "MC/tr/sum/pteta/num", "MC/he/sum/pteta/num", "MC/al/sum/pteta/num", - "MC/all/sum/pteta/num", - "MC/el/pos/pteta/num", "MC/mu/pos/pteta/num", "MC/pi/pos/pteta/num", - "MC/ka/pos/pteta/num", "MC/pr/pos/pteta/num", "MC/de/pos/pteta/num", - "MC/tr/pos/pteta/num", "MC/he/pos/pteta/num", "MC/al/pos/pteta/num", - "MC/all/pos/pteta/num", - "MC/el/neg/pteta/num", "MC/mu/neg/pteta/num", "MC/pi/neg/pteta/num", - "MC/ka/neg/pteta/num", "MC/pr/neg/pteta/num", "MC/de/neg/pteta/num", - "MC/tr/neg/pteta/num", "MC/he/neg/pteta/num", "MC/al/neg/pteta/num", - "MC/all/neg/pteta/num"}; - static constexpr std::string_view hPtEtaNumTrk[nHistograms] = {"MC/el/sum/pteta/numtrk", "MC/mu/sum/pteta/numtrk", "MC/pi/sum/pteta/numtrk", - "MC/ka/sum/pteta/numtrk", "MC/pr/sum/pteta/numtrk", "MC/de/sum/pteta/numtrk", - "MC/tr/sum/pteta/numtrk", "MC/he/sum/pteta/numtrk", "MC/al/sum/pteta/numtrk", - "MC/all/sum/pteta/numtrk", - "MC/el/pos/pteta/numtrk", "MC/mu/pos/pteta/numtrk", "MC/pi/pos/pteta/numtrk", - "MC/ka/pos/pteta/numtrk", "MC/pr/pos/pteta/numtrk", "MC/de/pos/pteta/numtrk", - "MC/tr/pos/pteta/numtrk", "MC/he/pos/pteta/numtrk", "MC/al/pos/pteta/numtrk", - "MC/all/pos/pteta/numtrk", - "MC/el/neg/pteta/numtrk", "MC/mu/neg/pteta/numtrk", "MC/pi/neg/pteta/numtrk", - "MC/ka/neg/pteta/numtrk", "MC/pr/neg/pteta/numtrk", "MC/de/neg/pteta/numtrk", - "MC/tr/neg/pteta/numtrk", "MC/he/neg/pteta/numtrk", "MC/al/neg/pteta/numtrk", - "MC/all/neg/pteta/numtrk"}; - static constexpr std::string_view hPtEtaNumTof[nHistograms] = {"MC/el/sum/pteta/numtof", "MC/mu/sum/pteta/numtof", "MC/pi/sum/pteta/numtof", - "MC/ka/sum/pteta/numtof", "MC/pr/sum/pteta/numtof", "MC/de/sum/pteta/numtof", - "MC/tr/sum/pteta/numtof", "MC/he/sum/pteta/numtof", "MC/al/sum/pteta/numtof", - "MC/all/sum/pteta/numtof", - "MC/el/pos/pteta/numtof", "MC/mu/pos/pteta/numtof", "MC/pi/pos/pteta/numtof", - "MC/ka/pos/pteta/numtof", "MC/pr/pos/pteta/numtof", "MC/de/pos/pteta/numtof", - "MC/tr/pos/pteta/numtof", "MC/he/pos/pteta/numtof", "MC/al/pos/pteta/numtof", - "MC/all/pos/pteta/numtof", - "MC/el/sum/pteta/numtof", "MC/mu/sum/pteta/numtof", "MC/pi/sum/pteta/numtof", - "MC/ka/sum/pteta/numtof", "MC/pr/sum/pteta/numtof", "MC/de/sum/pteta/numtof", - "MC/tr/sum/pteta/numtof", "MC/he/sum/pteta/numtof", "MC/al/sum/pteta/numtof", - "MC/all/sum/pteta/numtof"}; - static constexpr std::string_view hPtEtaDen[nHistograms] = {"MC/el/sum/pteta/den", "MC/mu/sum/pteta/den", "MC/pi/sum/pteta/den", - "MC/ka/sum/pteta/den", "MC/pr/sum/pteta/den", "MC/de/sum/pteta/den", - "MC/tr/sum/pteta/den", "MC/he/sum/pteta/den", "MC/al/sum/pteta/den", - "MC/all/sum/pteta/den", - "MC/el/pos/pteta/den", "MC/mu/pos/pteta/den", "MC/pi/pos/pteta/den", - "MC/ka/pos/pteta/den", "MC/pr/pos/pteta/den", "MC/de/pos/pteta/den", - "MC/tr/pos/pteta/den", "MC/he/pos/pteta/den", "MC/al/pos/pteta/den", - "MC/all/pos/pteta/den", - "MC/el/neg/pteta/den", "MC/mu/neg/pteta/den", "MC/pi/neg/pteta/den", - "MC/ka/neg/pteta/den", "MC/pr/neg/pteta/den", "MC/de/neg/pteta/den", - "MC/tr/neg/pteta/den", "MC/he/neg/pteta/den", "MC/al/neg/pteta/den", - "MC/all/neg/pteta/den"}; - - template + static constexpr std::string_view hPtEtaItsTpc[nHistograms] = {"MC/el/pos/pteta/its_tpc", "MC/mu/pos/pteta/its_tpc", "MC/pi/pos/pteta/its_tpc", + "MC/ka/pos/pteta/its_tpc", "MC/pr/pos/pteta/its_tpc", "MC/de/pos/pteta/its_tpc", + "MC/tr/pos/pteta/its_tpc", "MC/he/pos/pteta/its_tpc", "MC/al/pos/pteta/its_tpc", + "MC/all/pos/pteta/its_tpc", + "MC/el/neg/pteta/its_tpc", "MC/mu/neg/pteta/its_tpc", "MC/pi/neg/pteta/its_tpc", + "MC/ka/neg/pteta/its_tpc", "MC/pr/neg/pteta/its_tpc", "MC/de/neg/pteta/its_tpc", + "MC/tr/neg/pteta/its_tpc", "MC/he/neg/pteta/its_tpc", "MC/al/neg/pteta/its_tpc", + "MC/all/neg/pteta/its_tpc"}; + static constexpr std::string_view hPtEtaTrkItsTpc[nHistograms] = {"MC/el/pos/pteta/trk/its_tpc", "MC/mu/pos/pteta/trk/its_tpc", "MC/pi/pos/pteta/trk/its_tpc", + "MC/ka/pos/pteta/trk/its_tpc", "MC/pr/pos/pteta/trk/its_tpc", "MC/de/pos/pteta/trk/its_tpc", + "MC/tr/pos/pteta/trk/its_tpc", "MC/he/pos/pteta/trk/its_tpc", "MC/al/pos/pteta/trk/its_tpc", + "MC/all/pos/pteta/trk/its_tpc", + "MC/el/neg/pteta/trk/its_tpc", "MC/mu/neg/pteta/trk/its_tpc", "MC/pi/neg/pteta/trk/its_tpc", + "MC/ka/neg/pteta/trk/its_tpc", "MC/pr/neg/pteta/trk/its_tpc", "MC/de/neg/pteta/trk/its_tpc", + "MC/tr/neg/pteta/trk/its_tpc", "MC/he/neg/pteta/trk/its_tpc", "MC/al/neg/pteta/trk/its_tpc", + "MC/all/neg/pteta/trk/its_tpc"}; + static constexpr std::string_view hPtEtaItsTpcTof[nHistograms] = {"MC/el/pos/pteta/its_tpc_tof", "MC/mu/pos/pteta/its_tpc_tof", "MC/pi/pos/pteta/its_tpc_tof", + "MC/ka/pos/pteta/its_tpc_tof", "MC/pr/pos/pteta/its_tpc_tof", "MC/de/pos/pteta/its_tpc_tof", + "MC/tr/pos/pteta/its_tpc_tof", "MC/he/pos/pteta/its_tpc_tof", "MC/al/pos/pteta/its_tpc_tof", + "MC/all/pos/pteta/its_tpc_tof", + "MC/el/neg/pteta/its_tpc_tof", "MC/mu/neg/pteta/its_tpc_tof", "MC/pi/neg/pteta/its_tpc_tof", + "MC/ka/neg/pteta/its_tpc_tof", "MC/pr/neg/pteta/its_tpc_tof", "MC/de/neg/pteta/its_tpc_tof", + "MC/tr/neg/pteta/its_tpc_tof", "MC/he/neg/pteta/its_tpc_tof", "MC/al/neg/pteta/its_tpc_tof", + "MC/all/neg/pteta/its_tpc_tof"}; + static constexpr std::string_view hPtEtaGenerated[nHistograms] = {"MC/el/pos/pteta/generated", "MC/mu/pos/pteta/generated", "MC/pi/pos/pteta/generated", + "MC/ka/pos/pteta/generated", "MC/pr/pos/pteta/generated", "MC/de/pos/pteta/generated", + "MC/tr/pos/pteta/generated", "MC/he/pos/pteta/generated", "MC/al/pos/pteta/generated", + "MC/all/pos/pteta/generated", + "MC/el/neg/pteta/generated", "MC/mu/neg/pteta/generated", "MC/pi/neg/pteta/generated", + "MC/ka/neg/pteta/generated", "MC/pr/neg/pteta/generated", "MC/de/neg/pteta/generated", + "MC/tr/neg/pteta/generated", "MC/he/neg/pteta/generated", "MC/al/neg/pteta/generated", + "MC/all/neg/pteta/generated"}; + + static const char* particleName(int charge, o2::track::PID::ID id) + { + return Form("%s %s", charge == 0 ? "Positive" : "Negative", id == o2::track::PID::NIDs ? "All" : o2::track::PID::getName(id)); + } + + template void makeMCHistograms(const bool doMakeHistograms) { if (!doMakeHistograms) { return; } - AxisSpec axisPt{ptBins, ptMin, ptMax, "#it{p}_{T} (GeV/#it{c})"}; - AxisSpec axisP{ptBins, ptMin, ptMax, "#it{p} (GeV/#it{c})"}; + + if constexpr (charge == 0) { + if (!doPositivePDG) { // Positive + return; + } + } else if constexpr (charge == 1) { + if (!doNegativePDG) { // Negative + return; + } + } else { + LOG(fatal) << "Can't interpret charge " << charge; + } + + AxisSpec axisPt{ptBins, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec axisP{ptBins, "#it{p} (GeV/#it{c})"}; if (logPt) { axisPt.makeLogarithmic(); axisP.makeLogarithmic(); } - const AxisSpec axisEta{etaBins, etaMin, etaMax, "#it{#eta}"}; - const AxisSpec axisY{yBins, yMin, yMax, "#it{y}"}; - const AxisSpec axisPhi{phiBins, phiMin, phiMax, "#it{#varphi} (rad)"}; + const AxisSpec axisEta{etaBins, "#it{#eta}"}; + const AxisSpec axisY{yBins, "#it{y}"}; + const AxisSpec axisPhi{phiBins, "#it{#varphi} (rad)"}; - const char* partName = id == o2::track::PID::NIDs ? "All" : o2::track::PID::getName(id); - LOG(debug) << "Preparing histograms for particle: " << partName; + const char* partName = particleName(charge, id); + LOG(info) << "Preparing histograms for particle: " << partName << " charge " << charge; const TString tagPt = Form("%s #it{#eta} [%.2f,%.2f] #it{y} [%.2f,%.2f] #it{#varphi} [%.2f,%.2f]", partName, - etaMin.value, etaMax.value, - yMin.value, yMax.value, - phiMin.value, phiMax.value); + etaMin, etaMax, + yMin, yMax, + phiMin, phiMax); const TString tagEta = Form("%s #it{p}_{T} [%.2f,%.2f] #it{y} [%.2f,%.2f] #it{#varphi} [%.2f,%.2f]", partName, - ptMin.value, ptMax.value, - yMin.value, yMax.value, - phiMin.value, phiMax.value); + ptMin, ptMax, + yMin, yMax, + phiMin, phiMax); const TString tagY = Form("%s #it{p}_{T} [%.2f,%.2f] #it{#eta} [%.2f,%.2f] #it{#varphi} [%.2f,%.2f]", partName, - ptMin.value, ptMax.value, - etaMin.value, etaMax.value, - phiMin.value, phiMax.value); + ptMin, ptMax, + etaMin, etaMax, + phiMin, phiMax); const TString tagPhi = Form("%s #it{p}_{T} [%.2f,%.2f] #it{#eta} [%.2f,%.2f] #it{y} [%.2f,%.2f]", partName, - ptMin.value, ptMax.value, - etaMin.value, etaMax.value, - yMin.value, yMax.value); + ptMin, ptMax, + etaMin, etaMax, + yMin, yMax); const TString tagPtEta = Form("%s #it{#varphi} [%.2f,%.2f] #it{y} [%.2f,%.2f]", partName, - phiMin.value, phiMax.value, - yMin.value, yMax.value); - - auto makeHistogramsPerCharge = [&](const int chargeIndex) { - const int histogramIndex = id + chargeIndex * nSpecies; - histos.add(hPtNum[histogramIndex].data(), "Numerator " + tagPt, kTH1D, {axisPt}); - histos.add(hPtNumTrk[histogramIndex].data(), "Numerator Track " + tagPt, kTH1D, {axisPt}); - histos.add(hPtNumTof[histogramIndex].data(), "Numerator TOF " + tagPt, kTH1D, {axisPt}); - histos.add(hPtDen[histogramIndex].data(), "Denominator " + tagPt, kTH1D, {axisPt}); - - histos.add(hPtPrmNum[histogramIndex].data(), "Numerator " + tagPt + " Primaries", kTH1D, {axisPt}); - histos.add(hPtPrmNumTrk[histogramIndex].data(), "Numerator Track " + tagPt + " Primaries", kTH1D, {axisPt}); - histos.add(hPtPrmNumTof[histogramIndex].data(), "Numerator TOF " + tagPt + " Primaries", kTH1D, {axisPt}); - histos.add(hPtPrmDen[histogramIndex].data(), "Denominator " + tagPt + " Primaries", kTH1D, {axisPt}); - - histos.add(hPtDecNum[histogramIndex].data(), "Numerator " + tagPt + " Sec. from decays", kTH1D, {axisPt}); - histos.add(hPtDecNumTrk[histogramIndex].data(), "Numerator Track " + tagPt + " Sec. from decays", kTH1D, {axisPt}); - histos.add(hPtDecNumTof[histogramIndex].data(), "Numerator TOF " + tagPt + " Sec. from decays", kTH1D, {axisPt}); - histos.add(hPtDecDen[histogramIndex].data(), "Denominator " + tagPt + " Sec. from decays", kTH1D, {axisPt}); - - histos.add(hPtMatNum[histogramIndex].data(), "Numerator " + tagPt + " Sec. from material", kTH1D, {axisPt}); - histos.add(hPtMatNumTrk[histogramIndex].data(), "Numerator Track " + tagPt + " Sec. from material", kTH1D, {axisPt}); - histos.add(hPtMatNumTof[histogramIndex].data(), "Numerator TOF " + tagPt + " Sec. from material", kTH1D, {axisPt}); - histos.add(hPtMatDen[histogramIndex].data(), "Denominator " + tagPt + " Sec. from material", kTH1D, {axisPt}); - - histos.add(hPNum[histogramIndex].data(), "Numerator " + tagPt, kTH1D, {axisP}); - histos.add(hPNumTrk[histogramIndex].data(), "Numerator Track " + tagPt, kTH1D, {axisP}); - histos.add(hPNumTof[histogramIndex].data(), "Numerator TOF " + tagPt, kTH1D, {axisP}); - histos.add(hPDen[histogramIndex].data(), "Denominator " + tagPt, kTH1D, {axisP}); - - histos.add(hEtaNum[histogramIndex].data(), "Numerator " + tagEta, kTH1D, {axisEta}); - histos.add(hEtaNumTrk[histogramIndex].data(), "Numerator Track " + tagEta, kTH1D, {axisEta}); - histos.add(hEtaNumTof[histogramIndex].data(), "Numerator TOF " + tagEta, kTH1D, {axisEta}); - histos.add(hEtaDen[histogramIndex].data(), "Denominator " + tagEta, kTH1D, {axisEta}); - - histos.add(hYNum[histogramIndex].data(), "Numerator " + tagY, kTH1D, {axisY}); - histos.add(hYNumTof[histogramIndex].data(), "Numerator TOF " + tagY, kTH1D, {axisY}); - histos.add(hYDen[histogramIndex].data(), "Denominator " + tagY, kTH1D, {axisY}); - - histos.add(hPhiNum[histogramIndex].data(), "Numerator " + tagPhi, kTH1D, {axisPhi}); - histos.add(hPhiNumTrk[histogramIndex].data(), "Numerator Track " + tagPhi, kTH1D, {axisPhi}); - histos.add(hPhiNumTof[histogramIndex].data(), "Numerator TOF " + tagPhi, kTH1D, {axisPhi}); - histos.add(hPhiDen[histogramIndex].data(), "Denominator " + tagPhi, kTH1D, {axisPhi}); - - histos.add(hPtEtaNum[histogramIndex].data(), "Numerator " + tagPtEta, kTH2D, {axisPt, axisEta}); - histos.add(hPtEtaDen[histogramIndex].data(), "Denominator " + tagPtEta, kTH2D, {axisPt, axisEta}); + phiMin, phiMax, + yMin, yMax); + + const int histogramIndex = id + charge * nSpecies; + HistogramRegistry* registry = &histosPos; + if (charge == 1) { + registry = &histosNeg; + } + + registry->add(hPtIts[histogramIndex].data(), "ITS tracks " + tagPt, kTH1F, {axisPt}); + registry->add(hPtTpc[histogramIndex].data(), "TPC tracks " + tagPt, kTH1F, {axisPt}); + registry->add(hPtItsTpc[histogramIndex].data(), "ITS-TPC tracks " + tagPt, kTH1F, {axisPt}); + registry->add(hPtItsTof[histogramIndex].data(), "ITS-TOF tracks " + tagPt, kTH1F, {axisPt}); + registry->add(hPtTpcTof[histogramIndex].data(), "TPC-TOF tracks " + tagPt, kTH1F, {axisPt}); + registry->add(hPtItsTpcTof[histogramIndex].data(), "ITS-TPC-TOF tracks " + tagPt, kTH1F, {axisPt}); + registry->add(hPtTrkItsTpc[histogramIndex].data(), "ITS-TPC track (reco) " + tagPt, kTH1F, {axisPt}); + registry->add(hPtGenerated[histogramIndex].data(), "Generated " + tagPt, kTH1F, {axisPt}); + + registry->add(hPtItsPrm[histogramIndex].data(), "ITS tracks (primaries) " + tagPt, kTH1F, {axisPt}); + registry->add(hPtItsTpcPrm[histogramIndex].data(), "ITS-TPC tracks (primaries) " + tagPt, kTH1F, {axisPt}); + registry->add(hPtTrkItsTpcPrm[histogramIndex].data(), "ITS-TPC tracks (reco primaries) " + tagPt, kTH1F, {axisPt}); + registry->add(hPtItsTpcTofPrm[histogramIndex].data(), "ITS-TPC-TOF tracks (primaries) " + tagPt, kTH1F, {axisPt}); + registry->add(hPtGeneratedPrm[histogramIndex].data(), "Generated (primaries) " + tagPt, kTH1F, {axisPt}); + + registry->add(hPtItsTpcStr[histogramIndex].data(), "ITS-TPC tracks (from weak decays) " + tagPt, kTH1F, {axisPt}); + registry->add(hPtTrkItsTpcStr[histogramIndex].data(), "ITS-TPC tracks (reco from weak decays) " + tagPt, kTH1F, {axisPt}); + registry->add(hPtItsTpcTofStr[histogramIndex].data(), "ITS-TPC-TOF tracks (from weak decays) " + tagPt, kTH1F, {axisPt}); + registry->add(hPtGeneratedStr[histogramIndex].data(), "Generated (from weak decays) " + tagPt, kTH1F, {axisPt}); + + registry->add(hPtItsTpcMat[histogramIndex].data(), "ITS-TPC tracks (from material)" + tagPt, kTH1F, {axisPt}); + registry->add(hPtTrkItsTpcMat[histogramIndex].data(), "ITS-TPC tracks (reco from material) " + tagPt, kTH1F, {axisPt}); + registry->add(hPtItsTpcTofMat[histogramIndex].data(), "ITS-TPC-TOF tracks ( from material) " + tagPt, kTH1F, {axisPt}); + registry->add(hPtGeneratedMat[histogramIndex].data(), "Generated ( from material) " + tagPt, kTH1F, {axisPt}); + + registry->add(hPItsTpc[histogramIndex].data(), "ITS-TPC tracks " + tagPt, kTH1F, {axisP}); + registry->add(hPTrkItsTpc[histogramIndex].data(), "ITS-TPC tracks (reco) " + tagPt, kTH1F, {axisP}); + registry->add(hPItsTpcTof[histogramIndex].data(), "ITS-TPC-TOF tracks " + tagPt, kTH1F, {axisP}); + registry->add(hPGenerated[histogramIndex].data(), "Generated " + tagPt, kTH1F, {axisP}); + + registry->add(hEtaItsTpc[histogramIndex].data(), "ITS-TPC tracks " + tagEta, kTH1F, {axisEta}); + registry->add(hEtaTrkItsTpc[histogramIndex].data(), "ITS-TPC tracks (reco) " + tagEta, kTH1F, {axisEta}); + registry->add(hEtaItsTpcTof[histogramIndex].data(), "ITS-TPC-TOF tracks " + tagEta, kTH1F, {axisEta}); + registry->add(hEtaGenerated[histogramIndex].data(), "Generated " + tagEta, kTH1F, {axisEta}); + + registry->add(hYItsTpc[histogramIndex].data(), "ITS-TPC tracks " + tagY, kTH1F, {axisY}); + registry->add(hYItsTpcTof[histogramIndex].data(), "ITS-TPC-TOF tracks " + tagY, kTH1F, {axisY}); + registry->add(hYGenerated[histogramIndex].data(), "Generated " + tagY, kTH1F, {axisY}); + + registry->add(hPhiItsTpc[histogramIndex].data(), "ITS-TPC tracks " + tagPhi, kTH1F, {axisPhi}); + registry->add(hPhiTrkItsTpc[histogramIndex].data(), "ITS-TPC tracks (reco) " + tagPhi, kTH1F, {axisPhi}); + registry->add(hPhiItsTpcTof[histogramIndex].data(), "ITS-TPC-TOF tracks " + tagPhi, kTH1F, {axisPhi}); + registry->add(hPhiGenerated[histogramIndex].data(), "Generated " + tagPhi, kTH1F, {axisPhi}); + + if (doPtEta) { + registry->add(hPtEtaItsTpc[histogramIndex].data(), "ITS-TPC tracks " + tagPtEta, kTH2D, {axisPt, axisEta}); + registry->add(hPtEtaTrkItsTpc[histogramIndex].data(), "ITS-TPC tracks (reco) " + tagPtEta, kTH2D, {axisPt, axisEta}); + registry->add(hPtEtaItsTpcTof[histogramIndex].data(), "ITS-TPC-TOF tracks " + tagPtEta, kTH2D, {axisPt, axisEta}); + registry->add(hPtEtaGenerated[histogramIndex].data(), "Generated " + tagPtEta, kTH2D, {axisPt, axisEta}); + } + + LOG(info) << "Done with particle: " << partName; + } + + template + void makeMCEfficiency(const bool doMakeHistograms) + { + if (!doMakeHistograms) { + return; + } + + if (!makeEff) { + return; + } + + if constexpr (charge == 0) { + if (!doPositivePDG) { // Positive + return; + } + } else if constexpr (charge == 1) { + if (!doNegativePDG) { // Negative + return; + } + } else { + LOG(fatal) << "Can't interpret charge index"; + } + + const TString partName = particleName(charge, id); + LOG(info) << "Making TEfficiency for MC for particle " << partName; + THashList* subList = new THashList(); + subList->SetName(partName); + listEfficiencyMC->Add(subList); + + HistogramRegistry* registry = &histosPos; + if (charge == 1) { + registry = &histosNeg; + } + + auto makeEfficiency = [&](const TString effname, auto templateHisto) { // 1D efficiencies + const auto h = registry->get(templateHisto); + LOG(debug) << " Making 1D TEfficiency " << effname << " from " << h->GetName(); + const TAxis* axis = h->GetXaxis(); + TString efftitle = h->GetTitle(); + efftitle.ReplaceAll("Numerator", "").Strip(TString::kBoth); + efftitle = Form("%s;%s;Efficiency", efftitle.Data(), axis->GetTitle()); + if (axis->IsVariableBinSize()) { + subList->Add(new TEfficiency(effname, efftitle, axis->GetNbins(), axis->GetXbins()->GetArray())); + } else { + subList->Add(new TEfficiency(effname, efftitle, axis->GetNbins(), axis->GetXmin(), axis->GetXmax())); + } }; - if (doSumPDG) { // Sum - makeHistogramsPerCharge(0); - } - if (doPositivePDG) { // Positive - makeHistogramsPerCharge(1); - } - if (doNegativePDG) { // Negative - makeHistogramsPerCharge(2); - } - - if (makeEff && doSumPDG) { - LOG(debug) << "Making TEfficiency for MC"; - TList* subList = new TList(); - subList->SetName(partName); - listEfficiencyMC->Add(subList); - auto makeEfficiency = [&](TString effname, auto templateHisto) { - effname = partName + effname; - LOG(debug) << " - " << effname; - const auto h = histos.get(templateHisto); - const TAxis* axis = h->GetXaxis(); - TString efftitle = h->GetTitle(); - efftitle.ReplaceAll("Numerator", "").Strip(TString::kBoth); - efftitle = Form("%s;%s;Efficiency", efftitle.Data(), axis->GetTitle()); - if (axis->IsVariableBinSize()) { - subList->Add(new TEfficiency(effname, efftitle, axis->GetNbins(), axis->GetXbins()->GetArray())); - } else { - subList->Add(new TEfficiency(effname, efftitle, axis->GetNbins(), axis->GetXmin(), axis->GetXmax())); - } - }; - makeEfficiency("efficiencyVsPt", HIST(hPtNum[id])); - makeEfficiency("efficiencyVsPtPrm", HIST(hPtPrmNum[id])); - makeEfficiency("efficiencyVsPtDec", HIST(hPtDecNum[id])); - makeEfficiency("efficiencyVsPtMat", HIST(hPtMatNum[id])); - makeEfficiency("efficiencyVsP", HIST(hPNum[id])); - makeEfficiency("efficiencyVsEta", HIST(hEtaNum[id])); - makeEfficiency("efficiencyVsPhi", HIST(hPhiNum[id])); - - auto makeEfficiency2D = [&](TString effname, auto templateHisto) { - effname = partName + effname; - LOG(debug) << " - " << effname; - const auto h = histos.get(templateHisto); - const TAxis* axisX = h->GetXaxis(); - const TAxis* axisY = h->GetYaxis(); - TString efftitle = h->GetTitle(); - efftitle.ReplaceAll("Numerator", "").Strip(TString::kBoth); - efftitle = Form("%s;%s;%s;Efficiency", efftitle.Data(), axisX->GetTitle(), axisY->GetTitle()); - if (axisX->IsVariableBinSize() || axisY->IsVariableBinSize()) { - subList->Add(new TEfficiency(effname, efftitle, axisX->GetNbins(), axisX->GetXbins()->GetArray(), axisY->GetNbins(), axisY->GetXbins()->GetArray())); - } else { - subList->Add(new TEfficiency(effname, efftitle, axisX->GetNbins(), axisX->GetXmin(), axisX->GetXmax(), axisY->GetNbins(), axisY->GetXmin(), axisY->GetXmax())); - } - }; - makeEfficiency2D("efficiencyVsPtVsEta", HIST(hPtEtaNum[id])); + const int histogramIndex = id + charge * nSpecies; + + makeEfficiency("ITS_vsPt", HIST(hPtIts[histogramIndex])); + makeEfficiency("TPC_vsPt", HIST(hPtTpc[histogramIndex])); + makeEfficiency("ITS-TPC_vsPt", HIST(hPtItsTpc[histogramIndex])); + makeEfficiency("ITS-TOF_vsPt", HIST(hPtItsTof[histogramIndex])); + makeEfficiency("Tpc-TOF_vsPt", HIST(hPtTpcTof[histogramIndex])); + makeEfficiency("ITS-TPC-TOF_vsPt", HIST(hPtItsTpcTof[histogramIndex])); + makeEfficiency("ITS-TPC_vsPt_Trk", HIST(hPtTrkItsTpc[histogramIndex])); + + makeEfficiency("ITS_vsPt_Prm", HIST(hPtItsPrm[histogramIndex])); + makeEfficiency("ITS-TPC_vsPt_Prm", HIST(hPtItsTpcPrm[histogramIndex])); + makeEfficiency("ITS-TPC_vsPt_Prm_Trk", HIST(hPtTrkItsTpcPrm[histogramIndex])); + makeEfficiency("ITS-TPC-TOF_vsPt_Prm", HIST(hPtItsTpcTofPrm[histogramIndex])); + + makeEfficiency("ITS-TPC_vsPt_Str", HIST(hPtItsTpcStr[histogramIndex])); + makeEfficiency("ITS-TPC_vsPt_Str_Trk", HIST(hPtTrkItsTpcStr[histogramIndex])); + makeEfficiency("ITS-TPC-TOF_vsPt_Str", HIST(hPtItsTpcTofStr[histogramIndex])); + + makeEfficiency("ITS-TPC_vsPt_Mat", HIST(hPtItsTpcMat[histogramIndex])); + makeEfficiency("ITS-TPC_vsPt_Mat_Trk", HIST(hPtTrkItsTpcMat[histogramIndex])); + makeEfficiency("ITS-TPC-TOF_vsPt_Mat", HIST(hPtItsTpcTofMat[histogramIndex])); + + makeEfficiency("ITS-TPC_vsP", HIST(hPItsTpc[histogramIndex])); + makeEfficiency("ITS-TPC_vsP_Trk", HIST(hPTrkItsTpc[histogramIndex])); + makeEfficiency("ITS-TPC-TOF_vsP", HIST(hPItsTpcTof[histogramIndex])); + makeEfficiency("ITS-TPC_vsEta", HIST(hEtaItsTpc[histogramIndex])); + makeEfficiency("ITS-Tpc_vsEta_Trk", HIST(hEtaTrkItsTpc[histogramIndex])); + makeEfficiency("ITS-TPC-TOF_vsEta", HIST(hEtaItsTpcTof[histogramIndex])); + makeEfficiency("ITS-TPC_vsY", HIST(hYItsTpc[histogramIndex])); + makeEfficiency("ITS-TPC-TOF_vsY", HIST(hYItsTpcTof[histogramIndex])); + makeEfficiency("ITS-TPC_vsPhi", HIST(hPhiItsTpc[histogramIndex])); + makeEfficiency("ITS-TPC_vsPhi_Trk", HIST(hPhiTrkItsTpc[histogramIndex])); + makeEfficiency("ITS-TPC-TOF_vsPhi", HIST(hPhiItsTpcTof[histogramIndex])); + + auto makeEfficiency2D = [&](const TString effname, auto templateHisto) { // 2D efficiencies + const auto h = registry->get(templateHisto); + LOG(debug) << " Making 2D TEfficiency " << effname << " from " << h->GetName(); + const TAxis* axisX = h->GetXaxis(); + const TAxis* axisY = h->GetYaxis(); + TString efftitle = h->GetTitle(); + efftitle.ReplaceAll("Numerator", "").Strip(TString::kBoth); + efftitle = Form("%s;%s;%s;Efficiency", efftitle.Data(), axisX->GetTitle(), axisY->GetTitle()); + if (axisX->IsVariableBinSize() || axisY->IsVariableBinSize()) { + subList->Add(new TEfficiency(effname, efftitle, axisX->GetNbins(), axisX->GetXbins()->GetArray(), axisY->GetNbins(), axisY->GetXbins()->GetArray())); + } else { + subList->Add(new TEfficiency(effname, efftitle, axisX->GetNbins(), axisX->GetXmin(), axisX->GetXmax(), axisY->GetNbins(), axisY->GetXmin(), axisY->GetXmax())); + } + }; + + if (doPtEta) { + makeEfficiency2D("ITS-TPC_vsPt_vsEta", HIST(hPtEtaItsTpc[histogramIndex])); + makeEfficiency2D("ITS-TPC_vsPt_vsEta_Trk", HIST(hPtEtaTrkItsTpc[histogramIndex])); + makeEfficiency2D("ITS-TPC-TOF_vsPt_vsEta", HIST(hPtEtaItsTpcTof[histogramIndex])); } - LOG(debug) << "Done with particle: " << partName; + + LOG(info) << "Done with particle: " << partName << " for efficiencies"; } void initMC(const AxisSpec& axisSel) @@ -670,47 +658,69 @@ struct QaEfficiency { return; } - auto h = histos.add("MC/trackSelection", "Track Selection", kTH1D, {axisSel}); + auto h = histos.add("MC/trackSelection", "Track Selection", kTH1F, {axisSel}); h->GetXaxis()->SetBinLabel(1, "Tracks read"); h->GetXaxis()->SetBinLabel(2, "Passed has MC part."); - h->GetXaxis()->SetBinLabel(3, "Passed Ev. Reco."); - h->GetXaxis()->SetBinLabel(4, "Passed #it{p}_{T}"); - h->GetXaxis()->SetBinLabel(5, "Passed #it{#eta}"); - h->GetXaxis()->SetBinLabel(6, "Passed #it{#varphi}"); - h->GetXaxis()->SetBinLabel(7, "Passed y"); - h->GetXaxis()->SetBinLabel(8, "Passed Fake"); - h->GetXaxis()->SetBinLabel(9, "Passed standard quality cuts"); - h->GetXaxis()->SetBinLabel(10, "Passed has collision"); - for (int i = 0; i < nSpecies; i++) { - h->GetXaxis()->SetBinLabel(11 + i, Form("Passed PDG %i %s", PDGs[i], particleTitle[i])); - } - histos.add("MC/fakeTrackNoiseHits", "Fake tracks from noise hits", kTH1D, {{1, 0, 1}}); - - h = histos.add("MC/particleSelection", "Particle Selection", kTH1D, {axisSel}); - h->GetXaxis()->SetBinLabel(1, "Particles read"); - h->GetXaxis()->SetBinLabel(2, "Passed Ev. Reco."); h->GetXaxis()->SetBinLabel(3, "Passed #it{p}_{T}"); h->GetXaxis()->SetBinLabel(4, "Passed #it{#eta}"); h->GetXaxis()->SetBinLabel(5, "Passed #it{#varphi}"); h->GetXaxis()->SetBinLabel(6, "Passed y"); + h->GetXaxis()->SetBinLabel(7, "Passed Fake"); + h->GetXaxis()->SetBinLabel(8, "Passed has collision"); + h->GetXaxis()->SetBinLabel(9, "passedTrackType"); + h->GetXaxis()->SetBinLabel(10, "passedPtRange"); + h->GetXaxis()->SetBinLabel(11, "passedEtaRange"); + h->GetXaxis()->SetBinLabel(12, "passedDCAxy"); + h->GetXaxis()->SetBinLabel(13, "passedDCAz"); + h->GetXaxis()->SetBinLabel(14, "passedGoldenChi2"); + h->GetXaxis()->SetBinLabel(15, "passedITS (partial)"); + h->GetXaxis()->SetBinLabel(16, "passedTPC (partial)"); + h->GetXaxis()->SetBinLabel(17, "passedTOF (partial)"); + h->GetXaxis()->SetBinLabel(18, "Passed globalCut"); + + for (int i = 0; i < nSpecies; i++) { + h->GetXaxis()->SetBinLabel(19 + i, Form("Passed PDG %i %s", PDGs[i], particleTitle[i])); + } + histos.add("MC/fakeTrackNoiseHits", "Fake tracks from noise hits", kTH1F, {{1, 0, 1}}); + + h = histos.add("MC/particleSelection", "Particle Selection", kTH1F, {axisSel}); + h->GetXaxis()->SetBinLabel(1, "Particles read"); + h->GetXaxis()->SetBinLabel(2, "Passed #it{p}_{T}"); + h->GetXaxis()->SetBinLabel(3, "Passed #it{#eta}"); + h->GetXaxis()->SetBinLabel(4, "Passed #it{#varphi}"); + h->GetXaxis()->SetBinLabel(5, "Passed y"); for (int i = 0; i < nSpecies; i++) { - h->GetXaxis()->SetBinLabel(7 + i, Form("Passed PDG %i %s", PDGs[i], particleTitle[i])); - } - histos.add("MC/eventMultiplicity", "Event Selection", kTH1D, {{1000, 0, 5000}}); - - histos.add("MC/trackLength", "Track length;Track length (cm)", kTH1D, {{2000, -1000, 1000}}); - - listEfficiencyMC.setObject(new TList); - makeMCHistograms(doEl); - makeMCHistograms(doMu); - makeMCHistograms(doPi); - makeMCHistograms(doKa); - makeMCHistograms(doPr); - makeMCHistograms(doDe); - makeMCHistograms(doTr); - makeMCHistograms(doHe); - makeMCHistograms(doAl); - makeMCHistograms(doUnId); + h->GetXaxis()->SetBinLabel(6 + i, Form("Passed PDG %i %s", PDGs[i], particleTitle[i])); + } + histos.add("MC/eventMultiplicity", "Event Selection", kTH1F, {{1000, 0, 5000}}); + + histos.add("MC/trackLength", "Track length;Track length (cm)", kTH1F, {{2000, -1000, 1000}}); + + listEfficiencyMC.setObject(new THashList); + + static_for<0, 1>([&](auto charge) { + makeMCHistograms(doEl); + makeMCHistograms(doMu); + makeMCHistograms(doPi); + makeMCHistograms(doKa); + makeMCHistograms(doPr); + makeMCHistograms(doDe); + makeMCHistograms(doTr); + makeMCHistograms(doHe); + makeMCHistograms(doAl); + makeMCHistograms(doUnId); + + makeMCEfficiency(doEl); + makeMCEfficiency(doMu); + makeMCEfficiency(doPi); + makeMCEfficiency(doKa); + makeMCEfficiency(doPr); + makeMCEfficiency(doDe); + makeMCEfficiency(doTr); + makeMCEfficiency(doHe); + makeMCEfficiency(doAl); + makeMCEfficiency(doUnId); + }); } void initData(const AxisSpec& axisSel) @@ -719,111 +729,102 @@ struct QaEfficiency { return; } - auto h = histos.add("Data/trackSelection", "Track Selection", kTH1D, {axisSel}); + auto h = histos.add("Data/trackSelection", "Track Selection", kTH1F, {axisSel}); h->GetXaxis()->SetBinLabel(1, "Tracks read"); - h->GetXaxis()->SetBinLabel(2, "Passed #it{p}_{T}"); - h->GetXaxis()->SetBinLabel(3, "Passed #it{#eta}"); - h->GetXaxis()->SetBinLabel(4, "Passed #it{#varphi}"); - h->GetXaxis()->SetBinLabel(5, "Passed TrackType"); - h->GetXaxis()->SetBinLabel(6, "Passed PtRange"); - h->GetXaxis()->SetBinLabel(7, "Passed EtaRange"); - h->GetXaxis()->SetBinLabel(8, "Passed DCAxy"); - h->GetXaxis()->SetBinLabel(9, "Passed DCAz"); - h->GetXaxis()->SetBinLabel(10, "Passed GoldenChi2"); - h->GetXaxis()->SetBinLabel(11, "Passed quality cuts"); + h->GetXaxis()->SetBinLabel(2, ""); + h->GetXaxis()->SetBinLabel(3, "Passed #it{p}_{T}"); + h->GetXaxis()->SetBinLabel(4, "Passed #it{#eta}"); + h->GetXaxis()->SetBinLabel(5, "Passed #it{#varphi}"); + h->GetXaxis()->SetBinLabel(6, ""); + h->GetXaxis()->SetBinLabel(7, ""); + h->GetXaxis()->SetBinLabel(8, "Passed has collision"); + h->GetXaxis()->SetBinLabel(9, "passedTrackType"); + h->GetXaxis()->SetBinLabel(10, "passedPtRange"); + h->GetXaxis()->SetBinLabel(11, "passedEtaRange"); + h->GetXaxis()->SetBinLabel(12, "passedDCAxy"); + h->GetXaxis()->SetBinLabel(13, "passedDCAz"); + h->GetXaxis()->SetBinLabel(14, "passedGoldenChi2"); + h->GetXaxis()->SetBinLabel(15, "passedITS (partial)"); + h->GetXaxis()->SetBinLabel(16, "passedTPC (partial)"); + h->GetXaxis()->SetBinLabel(17, "passedTOF (partial)"); + h->GetXaxis()->SetBinLabel(18, "Passed globalCut"); const TString tagPt = Form("#it{#eta} [%.2f,%.2f] #it{#varphi} [%.2f,%.2f]", - etaMin.value, etaMax.value, - phiMin.value, phiMax.value); - AxisSpec axisPt{ptBins, ptMin, ptMax, "#it{p}_{T} (GeV/#it{c})"}; + etaMin, etaMax, + phiMin, phiMax); + AxisSpec axisPt{ptBins, "#it{p}_{T} (GeV/#it{c})"}; if (logPt) { axisPt.makeLogarithmic(); } const TString tagEta = Form("#it{p}_{T} [%.2f,%.2f] #it{#varphi} [%.2f,%.2f]", - ptMin.value, ptMax.value, - phiMin.value, phiMax.value); - const AxisSpec axisEta{etaBins, etaMin, etaMax, "#it{#eta}"}; + ptMin, ptMax, + phiMin, phiMax); + const AxisSpec axisEta{etaBins, "#it{#eta}"}; const TString tagPhi = Form("#it{#eta} [%.2f,%.2f] #it{p}_{T} [%.2f,%.2f]", - etaMin.value, etaMax.value, - ptMin.value, ptMax.value); - const AxisSpec axisPhi{phiBins, phiMin, phiMax, "#it{#varphi} (rad)"}; + etaMin, etaMax, + ptMin, ptMax); + const AxisSpec axisPhi{phiBins, "#it{#varphi} (rad)"}; const TString tagEtaPhi = Form("#it{p}_{T} [%.2f,%.2f]", - ptMin.value, ptMax.value); + ptMin, ptMax); - histos.add("Data/trackLength", "Track length;Track length (cm)", kTH1D, {{2000, -1000, 1000}}); + histos.add("Data/trackLength", "Track length;Track length (cm)", kTH1F, {{2000, -1000, 1000}}); // ITS-TPC-TOF - histos.add("Data/sum/pt/its_tpc_tof", "ITS-TPC-TOF " + tagPt, kTH1D, {axisPt}); - histos.add("Data/pos/pt/its_tpc_tof", "ITS-TPC-TOF Positive " + tagPt, kTH1D, {axisPt}); - histos.add("Data/neg/pt/its_tpc_tof", "ITS-TPC-TOF Negative " + tagPt, kTH1D, {axisPt}); + histos.add("Data/pos/pt/its_tpc_tof", "ITS-TPC-TOF Positive " + tagPt, kTH1F, {axisPt}); + histos.add("Data/neg/pt/its_tpc_tof", "ITS-TPC-TOF Negative " + tagPt, kTH1F, {axisPt}); - histos.add("Data/sum/eta/its_tpc_tof", "ITS-TPC-TOF " + tagEta, kTH1D, {axisEta}); - histos.add("Data/pos/eta/its_tpc_tof", "ITS-TPC-TOF Positive " + tagEta, kTH1D, {axisEta}); - histos.add("Data/neg/eta/its_tpc_tof", "ITS-TPC-TOF Negative " + tagEta, kTH1D, {axisEta}); + histos.add("Data/pos/eta/its_tpc_tof", "ITS-TPC-TOF Positive " + tagEta, kTH1F, {axisEta}); + histos.add("Data/neg/eta/its_tpc_tof", "ITS-TPC-TOF Negative " + tagEta, kTH1F, {axisEta}); - histos.add("Data/sum/phi/its_tpc_tof", "ITS-TPC-TOF " + tagPhi, kTH1D, {axisPhi}); - histos.add("Data/pos/phi/its_tpc_tof", "ITS-TPC-TOF Positive " + tagPhi, kTH1D, {axisPhi}); - histos.add("Data/neg/phi/its_tpc_tof", "ITS-TPC-TOF Negative " + tagPhi, kTH1D, {axisPhi}); + histos.add("Data/pos/phi/its_tpc_tof", "ITS-TPC-TOF Positive " + tagPhi, kTH1F, {axisPhi}); + histos.add("Data/neg/phi/its_tpc_tof", "ITS-TPC-TOF Negative " + tagPhi, kTH1F, {axisPhi}); - histos.add("Data/sum/etaphi/its_tpc_tof", "ITS-TPC-TOF " + tagEtaPhi, kTH2D, {axisEta, axisPhi}); histos.add("Data/pos/etaphi/its_tpc_tof", "ITS-TPC-TOF Positive " + tagEtaPhi, kTH2D, {axisEta, axisPhi}); histos.add("Data/neg/etaphi/its_tpc_tof", "ITS-TPC-TOF Negative " + tagEtaPhi, kTH2D, {axisEta, axisPhi}); // ITS-TPC - histos.add("Data/sum/pt/its_tpc", "ITS-TPC " + tagPt, kTH1D, {axisPt}); - histos.add("Data/pos/pt/its_tpc", "ITS-TPC Positive " + tagPt, kTH1D, {axisPt}); - histos.add("Data/neg/pt/its_tpc", "ITS-TPC Negative " + tagPt, kTH1D, {axisPt}); + histos.add("Data/pos/pt/its_tpc", "ITS-TPC Positive " + tagPt, kTH1F, {axisPt}); + histos.add("Data/neg/pt/its_tpc", "ITS-TPC Negative " + tagPt, kTH1F, {axisPt}); - histos.add("Data/sum/eta/its_tpc", "ITS-TPC " + tagEta, kTH1D, {axisEta}); - histos.add("Data/pos/eta/its_tpc", "ITS-TPC Positive " + tagEta, kTH1D, {axisEta}); - histos.add("Data/neg/eta/its_tpc", "ITS-TPC Negative " + tagEta, kTH1D, {axisEta}); + histos.add("Data/pos/eta/its_tpc", "ITS-TPC Positive " + tagEta, kTH1F, {axisEta}); + histos.add("Data/neg/eta/its_tpc", "ITS-TPC Negative " + tagEta, kTH1F, {axisEta}); - histos.add("Data/sum/phi/its_tpc", "ITS-TPC " + tagPhi, kTH1D, {axisPhi}); - histos.add("Data/pos/phi/its_tpc", "ITS-TPC Positive " + tagPhi, kTH1D, {axisPhi}); - histos.add("Data/neg/phi/its_tpc", "ITS-TPC Negative " + tagPhi, kTH1D, {axisPhi}); + histos.add("Data/pos/phi/its_tpc", "ITS-TPC Positive " + tagPhi, kTH1F, {axisPhi}); + histos.add("Data/neg/phi/its_tpc", "ITS-TPC Negative " + tagPhi, kTH1F, {axisPhi}); - histos.add("Data/sum/etaphi/its_tpc", "ITS-TPC " + tagEtaPhi, kTH2D, {axisEta, axisPhi}); histos.add("Data/pos/etaphi/its_tpc", "ITS-TPC Positive " + tagEtaPhi, kTH2D, {axisEta, axisPhi}); histos.add("Data/neg/etaphi/its_tpc", "ITS-TPC Negative " + tagEtaPhi, kTH2D, {axisEta, axisPhi}); // TPC - histos.add("Data/sum/pt/tpc", "TPC " + tagPt, kTH1D, {axisPt}); - histos.add("Data/pos/pt/tpc", "TPC Positive " + tagPt, kTH1D, {axisPt}); - histos.add("Data/neg/pt/tpc", "TPC Negative " + tagPt, kTH1D, {axisPt}); + histos.add("Data/pos/pt/tpc", "TPC Positive " + tagPt, kTH1F, {axisPt}); + histos.add("Data/neg/pt/tpc", "TPC Negative " + tagPt, kTH1F, {axisPt}); - histos.add("Data/sum/eta/tpc", "TPC " + tagEta, kTH1D, {axisEta}); - histos.add("Data/pos/eta/tpc", "TPC Positive " + tagEta, kTH1D, {axisEta}); - histos.add("Data/neg/eta/tpc", "TPC Negative " + tagEta, kTH1D, {axisEta}); + histos.add("Data/pos/eta/tpc", "TPC Positive " + tagEta, kTH1F, {axisEta}); + histos.add("Data/neg/eta/tpc", "TPC Negative " + tagEta, kTH1F, {axisEta}); - histos.add("Data/sum/phi/tpc", "TPC " + tagPhi, kTH1D, {axisPhi}); - histos.add("Data/pos/phi/tpc", "TPC Positive " + tagPhi, kTH1D, {axisPhi}); - histos.add("Data/neg/phi/tpc", "TPC Negative " + tagPhi, kTH1D, {axisPhi}); + histos.add("Data/pos/phi/tpc", "TPC Positive " + tagPhi, kTH1F, {axisPhi}); + histos.add("Data/neg/phi/tpc", "TPC Negative " + tagPhi, kTH1F, {axisPhi}); - histos.add("Data/sum/etaphi/tpc", "TPC " + tagEtaPhi, kTH2D, {axisEta, axisPhi}); histos.add("Data/pos/etaphi/tpc", "TPC Positive " + tagEtaPhi, kTH2D, {axisEta, axisPhi}); histos.add("Data/neg/etaphi/tpc", "TPC Negative " + tagEtaPhi, kTH2D, {axisEta, axisPhi}); // ITS - histos.add("Data/sum/pt/its", "ITS " + tagPt, kTH1D, {axisPt}); - histos.add("Data/pos/pt/its", "ITS Positive " + tagPt, kTH1D, {axisPt}); - histos.add("Data/neg/pt/its", "ITS Negative " + tagPt, kTH1D, {axisPt}); + histos.add("Data/pos/pt/its", "ITS Positive " + tagPt, kTH1F, {axisPt}); + histos.add("Data/neg/pt/its", "ITS Negative " + tagPt, kTH1F, {axisPt}); - histos.add("Data/sum/eta/its", "ITS " + tagEta, kTH1D, {axisEta}); - histos.add("Data/pos/eta/its", "ITS Positive " + tagEta, kTH1D, {axisEta}); - histos.add("Data/neg/eta/its", "ITS Negative " + tagEta, kTH1D, {axisEta}); + histos.add("Data/pos/eta/its", "ITS Positive " + tagEta, kTH1F, {axisEta}); + histos.add("Data/neg/eta/its", "ITS Negative " + tagEta, kTH1F, {axisEta}); - histos.add("Data/sum/phi/its", "ITS " + tagPhi, kTH1D, {axisPhi}); - histos.add("Data/pos/phi/its", "ITS Positive " + tagPhi, kTH1D, {axisPhi}); - histos.add("Data/neg/phi/its", "ITS Negative " + tagPhi, kTH1D, {axisPhi}); + histos.add("Data/pos/phi/its", "ITS Positive " + tagPhi, kTH1F, {axisPhi}); + histos.add("Data/neg/phi/its", "ITS Negative " + tagPhi, kTH1F, {axisPhi}); - histos.add("Data/sum/etaphi/its", "ITS " + tagEtaPhi, kTH2D, {axisEta, axisPhi}); histos.add("Data/pos/etaphi/its", "ITS Positive " + tagEtaPhi, kTH2D, {axisEta, axisPhi}); histos.add("Data/neg/etaphi/its", "ITS Negative " + tagEtaPhi, kTH2D, {axisEta, axisPhi}); - listEfficiencyData.setObject(new TList); + listEfficiencyData.setObject(new THashList); if (makeEff) { LOG(debug) << "Making TEfficiency for Data"; auto makeEfficiency = [&](TString effname, TString efftitle, auto templateHisto) { @@ -834,6 +835,13 @@ struct QaEfficiency { listEfficiencyData->Add(new TEfficiency(effname, efftitle, axis->GetNbins(), axis->GetXmin(), axis->GetXmax())); } }; + + makeEfficiency("ITSTPCMatchingEfficiencyVsPt", "ITS-TPC M.E. in data " + tagPt + ";#it{p}_{T} (GeV/#it{c});Efficiency", HIST("Data/pos/pt/its_tpc_tof")); + makeEfficiency("TPCTOFMatchingEfficiencyVsPt", "TPC-TOF M.E. in data " + tagPt + ";#it{p}_{T} (GeV/#it{c});Efficiency", HIST("Data/pos/pt/its_tpc_tof")); + makeEfficiency("TPCTOFMatchingEfficiencyVsP", "TPC-TOF M.E. in data " + tagPt + ";#it{p} (GeV/#it{c});Efficiency", HIST("Data/pos/pt/its_tpc_tof")); + makeEfficiency("TPCTOFMatchingEfficiencyVsEta", "TPC-TOF M.E. in data " + tagEta + ";#it{#eta};Efficiency", HIST("Data/pos/eta/its_tpc_tof")); + makeEfficiency("TPCTOFMatchingEfficiencyVsPhi", "TPC-TOF M.E. in data " + tagPhi + ";#it{#varphi} (rad);Efficiency", HIST("Data/pos/phi/its_tpc_tof")); + auto makeEfficiency2D = [&](TString effname, TString efftitle, auto templateHistoX, auto templateHistoY) { TAxis* axisX = histos.get(templateHistoX)->GetXaxis(); TAxis* axisY = histos.get(templateHistoY)->GetYaxis(); @@ -843,21 +851,54 @@ struct QaEfficiency { listEfficiencyData->Add(new TEfficiency(effname, efftitle, axisX->GetNbins(), axisX->GetXmin(), axisX->GetXmax(), axisY->GetNbins(), axisY->GetXmin(), axisY->GetXmax())); } }; - makeEfficiency("ITSTPCMatchingEfficiencyVsPt", "ITS-TPC M.E. in data " + tagPt + ";#it{p}_{T} (GeV/#it{c});Efficiency", HIST("Data/sum/pt/its_tpc_tof")); - makeEfficiency("TPCTOFMatchingEfficiencyVsPt", "TPC-TOF M.E. in data " + tagPt + ";#it{p}_{T} (GeV/#it{c});Efficiency", HIST("Data/sum/pt/its_tpc_tof")); - makeEfficiency("TPCTOFMatchingEfficiencyVsP", "TPC-TOF M.E. in data " + tagPt + ";#it{p} (GeV/#it{c});Efficiency", HIST("Data/sum/pt/its_tpc_tof")); - makeEfficiency("TPCTOFMatchingEfficiencyVsEta", "TPC-TOF M.E. in data " + tagEta + ";#it{#eta};Efficiency", HIST("Data/sum/eta/its_tpc_tof")); - makeEfficiency("TPCTOFMatchingEfficiencyVsPhi", "TPC-TOF M.E. in data " + tagPhi + ";#it{#varphi} (rad);Efficiency", HIST("Data/sum/phi/its_tpc_tof")); - makeEfficiency2D("TPCTOFMatchingEfficiencyVsPtVsEta", Form("TPC-TOF M.E. in data #it{#varphi} [%.2f,%.2f];%s;%s;Efficiency", phiMin.value, phiMax.value, "#it{p}_{T} (GeV/#it{c})", "#it{#eta}"), HIST("Data/sum/pt/its_tpc_tof"), HIST("Data/sum/eta/its_tpc_tof")); - makeEfficiency2D("TPCTOFMatchingEfficiencyVsPtVsPhi", Form("TPC-TOF M.E. in data #it{#eta} [%.2f,%.2f];%s;%s;Efficiency", etaMin.value, etaMax.value, "#it{p}_{T} (GeV/#it{c})", "#it{#varphi} (rad)"), HIST("Data/sum/pt/its_tpc_tof"), HIST("Data/sum/phi/its_tpc_tof")); + makeEfficiency2D("TPCTOFMatchingEfficiencyVsPtVsEta", Form("TPC-TOF M.E. in data #it{#varphi} [%.2f,%.2f];%s;%s;Efficiency", phiMin, phiMax, "#it{p}_{T} (GeV/#it{c})", "#it{#eta}"), HIST("Data/pos/pt/its_tpc_tof"), HIST("Data/pos/eta/its_tpc_tof")); + makeEfficiency2D("TPCTOFMatchingEfficiencyVsPtVsPhi", Form("TPC-TOF M.E. in data #it{#eta} [%.2f,%.2f];%s;%s;Efficiency", etaMin, etaMax, "#it{p}_{T} (GeV/#it{c})", "#it{#varphi} (rad)"), HIST("Data/pos/pt/its_tpc_tof"), HIST("Data/pos/phi/its_tpc_tof")); } } + // Selection cuts defined from the binning + double ptMin, ptMax; + double etaMin, etaMax; + double phiMin, phiMax; + double yMin, yMax; + void init(InitContext&) { - const AxisSpec axisSel{30, 0.5, 30.5, "Selection"}; - histos.add("eventSelection", "Event Selection", kTH1D, {axisSel}); + + // Printing configuration + LOG(info) << "Printing configuration"; + LOG(info) << "Set noFakesHits to: " << (noFakesHits ? "true" : "false"); + LOG(info) << "Set doPositivePDG to: " << (doPositivePDG ? "true" : "false"); + LOG(info) << "Set doNegativePDG to: " << (doNegativePDG ? "true" : "false"); + LOG(info) << "Set doUnId to: " << (doUnId ? "true" : "false"); + LOG(info) << "Set doEl to: " << (doEl ? "true" : "false"); + LOG(info) << "Set doMu to: " << (doMu ? "true" : "false"); + LOG(info) << "Set doPi to: " << (doPi ? "true" : "false"); + LOG(info) << "Set doKa to: " << (doKa ? "true" : "false"); + LOG(info) << "Set doPr to: " << (doPr ? "true" : "false"); + LOG(info) << "Set doDe to: " << (doDe ? "true" : "false"); + LOG(info) << "Set doTr to: " << (doTr ? "true" : "false"); + LOG(info) << "Set doHe to: " << (doHe ? "true" : "false"); + LOG(info) << "Set doAl to: " << (doAl ? "true" : "false"); + LOG(info) << "Set trackSelection to: " << (trackSelection ? "true" : "false"); + LOG(info) << "Set makeEff to: " << (makeEff ? "true" : "false"); + LOG(info) << "Set doPtEta to: " << (doPtEta ? "true" : "false"); + + auto doLimits = [&](double& min, double& max, const ConfigurableAxis& binning) { + const AxisSpec a{binning, "dummy"}; + min = a.binEdges[0]; + max = a.binEdges[1]; + LOG(info) << "Making limits from " << min << ", " << max << " size " << a.getNbins(); + }; + + doLimits(ptMin, ptMax, ptBins); + doLimits(etaMin, etaMax, etaBins); + doLimits(phiMin, phiMax, phiBins); + doLimits(yMin, yMax, yBins); + + const AxisSpec axisSel{40, 0.5, 40.5, "Selection"}; + histos.add("eventSelection", "Event Selection", kTH1F, {axisSel}); histos.get(HIST("eventSelection"))->GetXaxis()->SetBinLabel(1, "Events read"); histos.get(HIST("eventSelection"))->GetXaxis()->SetBinLabel(2, "Passed Ev. Sel."); histos.get(HIST("eventSelection"))->GetXaxis()->SetBinLabel(3, "Passed Contrib."); @@ -867,196 +908,282 @@ struct QaEfficiency { initMC(axisSel); } - template + template bool isPdgSelected(particleType mcParticle) { - static_assert(pdgSign == 0 || pdgSign == 1 || pdgSign == 2); + static_assert(charge == 0 || charge == 1); + static_assert(id > 0 || id < nSpecies); + // Selecting PDG code - if constexpr (PDGs[id] == 0) { - if constexpr (pdgSign == 0) { - return true; - } else if constexpr (pdgSign == 1) { - return mcParticle.pdgCode() > 0; - } - if constexpr (pdgSign == 2) { - return mcParticle.pdgCode() < 0; + if constexpr (PDGs[id] == 0) { // All PDGs + if constexpr (charge == 0) { + return mcParticle.pdgCode() > 0; // Positive + } else { + return mcParticle.pdgCode() < 0; // Negative } } - if constexpr (pdgSign == 0) { - if (abs(mcParticle.pdgCode()) != PDGs[id]) { - return false; - } - } else if constexpr (pdgSign == 1) { - if (mcParticle.pdgCode() != PDGs[id]) { - return false; - } - } else if constexpr (pdgSign == 2) { - if (mcParticle.pdgCode() != -PDGs[id]) { - return false; - } + // Specific PDGs + if constexpr (charge == 0) { + return mcParticle.pdgCode() == PDGs[id]; + } else { + return mcParticle.pdgCode() == -PDGs[id]; } - return true; } - template - void fillMCTrackHistograms(const trackType& track) + template + void fillMCTrackHistograms(const trackType& track, const bool doMakeHistograms) { - static_assert(pdgSign == 0 || pdgSign == 1 || pdgSign == 2); - if constexpr (pdgSign == 0) { - if (!doSumPDG) { - return; - } - } else if constexpr (pdgSign == 1) { + static_assert(charge == 0 || charge == 1); + if (!doMakeHistograms) { + return; + } + + if constexpr (charge == 0) { if (!doPositivePDG) { return; } - } else if constexpr (pdgSign == 2) { + } else { if (!doNegativePDG) { return; } } - constexpr int histogramIndex = id + pdgSign * nSpecies; - LOG(debug) << "Filling track histograms for id " << static_cast(id); + + auto& h = histosPos; + if (charge == 1) { + h = histosNeg; + } + + constexpr int histogramIndex = id + charge * nSpecies; + LOG(debug) << "fillMCTrackHistograms for charge '" << charge << "' and id '" << static_cast(id) << "' " << particleName(charge, id) << " with index " << histogramIndex; const auto mcParticle = track.mcParticle(); - if (!isPdgSelected(mcParticle)) { // Selecting PDG code + if (!isPdgSelected(mcParticle)) { // Selecting PDG code return; } - histos.fill(HIST("MC/trackSelection"), 11 + id); + histos.fill(HIST("MC/trackSelection"), 19 + id); - histos.fill(HIST(hPNum[histogramIndex]), mcParticle.p()); - histos.fill(HIST(hPtNum[histogramIndex]), mcParticle.pt()); - histos.fill(HIST(hEtaNum[histogramIndex]), mcParticle.eta()); - histos.fill(HIST(hYNum[histogramIndex]), mcParticle.y()); - histos.fill(HIST(hPhiNum[histogramIndex]), mcParticle.phi()); - histos.fill(HIST(hPtEtaNum[histogramIndex]), mcParticle.pt(), mcParticle.eta()); - - histos.fill(HIST(hPNumTrk[histogramIndex]), track.p()); - histos.fill(HIST(hPtNumTrk[histogramIndex]), track.pt()); - histos.fill(HIST(hEtaNumTrk[histogramIndex]), track.eta()); - histos.fill(HIST(hPhiNumTrk[histogramIndex]), track.phi()); + if (passedITS) { + h.fill(HIST(hPtIts[histogramIndex]), mcParticle.pt()); + } + if (passedTPC) { + h.fill(HIST(hPtTpc[histogramIndex]), mcParticle.pt()); + } + if (passedITS && passedTPC) { + h.fill(HIST(hPItsTpc[histogramIndex]), mcParticle.p()); + h.fill(HIST(hPtItsTpc[histogramIndex]), mcParticle.pt()); + h.fill(HIST(hEtaItsTpc[histogramIndex]), mcParticle.eta()); + h.fill(HIST(hYItsTpc[histogramIndex]), mcParticle.y()); + h.fill(HIST(hPhiItsTpc[histogramIndex]), mcParticle.phi()); + + h.fill(HIST(hPTrkItsTpc[histogramIndex]), track.p()); + h.fill(HIST(hPtTrkItsTpc[histogramIndex]), track.pt()); + h.fill(HIST(hEtaTrkItsTpc[histogramIndex]), track.eta()); + h.fill(HIST(hPhiTrkItsTpc[histogramIndex]), track.phi()); + + if (doPtEta) { + h.fill(HIST(hPtEtaItsTpc[histogramIndex]), mcParticle.pt(), mcParticle.eta()); + h.fill(HIST(hPtEtaTrkItsTpc[histogramIndex]), track.pt(), track.eta()); + if (passedTOF) { + h.fill(HIST(hPtEtaItsTpcTof[histogramIndex]), mcParticle.pt(), mcParticle.eta()); + } + } + } + if (passedITS && passedTOF) { + h.fill(HIST(hPtItsTof[histogramIndex]), mcParticle.pt()); + } + if (passedTPC && passedTOF) { + h.fill(HIST(hPtTpcTof[histogramIndex]), mcParticle.pt()); + } + if (passedITS && passedTPC && passedTOF) { + h.fill(HIST(hPItsTpcTof[histogramIndex]), mcParticle.p()); + h.fill(HIST(hPtItsTpcTof[histogramIndex]), mcParticle.pt()); + h.fill(HIST(hEtaItsTpcTof[histogramIndex]), mcParticle.eta()); + h.fill(HIST(hYItsTpcTof[histogramIndex]), mcParticle.y()); + h.fill(HIST(hPhiItsTpcTof[histogramIndex]), mcParticle.phi()); + } if (mcParticle.isPhysicalPrimary()) { - histos.fill(HIST(hPtPrmNum[histogramIndex]), mcParticle.pt()); - histos.fill(HIST(hPtPrmNumTrk[histogramIndex]), track.pt()); - if (track.hasTOF()) { - histos.fill(HIST(hPtPrmNumTof[histogramIndex]), mcParticle.pt()); + if (passedITS) { + h.fill(HIST(hPtItsPrm[histogramIndex]), mcParticle.pt()); } - } else { - if (mcParticle.getProcess() == 4) { // Particle deday - histos.fill(HIST(hPtDecNum[histogramIndex]), mcParticle.pt()); - histos.fill(HIST(hPtDecNumTrk[histogramIndex]), track.pt()); - if (track.hasTOF()) { - histos.fill(HIST(hPtDecNumTof[histogramIndex]), mcParticle.pt()); + if (passedITS && passedTPC) { + h.fill(HIST(hPtItsTpcPrm[histogramIndex]), mcParticle.pt()); + h.fill(HIST(hPtTrkItsTpcPrm[histogramIndex]), track.pt()); + if (passedTOF) { + h.fill(HIST(hPtItsTpcTofPrm[histogramIndex]), mcParticle.pt()); } - } else { // Material - histos.fill(HIST(hPtMatNum[histogramIndex]), mcParticle.pt()); - histos.fill(HIST(hPtMatNumTrk[histogramIndex]), track.pt()); - if (track.hasTOF()) { - histos.fill(HIST(hPtMatNumTof[histogramIndex]), mcParticle.pt()); + } + } else if (mcParticle.getProcess() == 4) { // Particle decay + if (passedITS && passedTPC) { + h.fill(HIST(hPtItsTpcStr[histogramIndex]), mcParticle.pt()); + h.fill(HIST(hPtTrkItsTpcStr[histogramIndex]), track.pt()); + if (passedTOF) { + h.fill(HIST(hPtItsTpcTofStr[histogramIndex]), mcParticle.pt()); + } + } + } else { // Material + if (passedITS && passedTPC) { + h.fill(HIST(hPtItsTpcMat[histogramIndex]), mcParticle.pt()); + h.fill(HIST(hPtTrkItsTpcMat[histogramIndex]), track.pt()); + if (passedTOF) { + h.fill(HIST(hPtItsTpcTofMat[histogramIndex]), mcParticle.pt()); } } } - if (!track.hasTOF()) { - return; - } - histos.fill(HIST(hPNumTof[histogramIndex]), mcParticle.p()); - histos.fill(HIST(hPtNumTof[histogramIndex]), mcParticle.pt()); - histos.fill(HIST(hEtaNumTof[histogramIndex]), mcParticle.eta()); - histos.fill(HIST(hYNumTof[histogramIndex]), mcParticle.y()); - histos.fill(HIST(hPhiNumTof[histogramIndex]), mcParticle.phi()); } - template - void fillMCParticleHistograms(const particleType& mcParticle) + template + void fillMCParticleHistograms(const particleType& mcParticle, const bool doMakeHistograms) { - static_assert(pdgSign == 0 || pdgSign == 1 || pdgSign == 2); - if constexpr (pdgSign == 0) { - if (!doSumPDG) { - return; - } - } else if constexpr (pdgSign == 1) { + static_assert(charge == 0 || charge == 1); + if (!doMakeHistograms) { + return; + } + + if constexpr (charge == 0) { if (!doPositivePDG) { return; } - } else if constexpr (pdgSign == 2) { + } else { if (!doNegativePDG) { return; } } - constexpr int histogramIndex = id + pdgSign * nSpecies; - LOG(debug) << "Filling particle histograms for id " << static_cast(id); - if (!isPdgSelected(mcParticle)) { // Selecting PDG code + + auto& h = histosPos; + if (charge == 1) { + h = histosNeg; + } + + constexpr int histogramIndex = id + charge * nSpecies; + LOG(debug) << "fillMCParticleHistograms for charge '" << charge << "' and id '" << static_cast(id) << "' " << particleName(charge, id) << " with index " << histogramIndex; + if (!isPdgSelected(mcParticle)) { // Selecting PDG code return; } histos.fill(HIST("MC/particleSelection"), 7 + id); - histos.fill(HIST(hPDen[histogramIndex]), mcParticle.p()); - histos.fill(HIST(hPtDen[histogramIndex]), mcParticle.pt()); + h.fill(HIST(hPGenerated[histogramIndex]), mcParticle.p()); + h.fill(HIST(hPtGenerated[histogramIndex]), mcParticle.pt()); if (mcParticle.isPhysicalPrimary()) { - histos.fill(HIST(hPtPrmDen[histogramIndex]), mcParticle.pt()); + h.fill(HIST(hPtGeneratedPrm[histogramIndex]), mcParticle.pt()); } else { if (mcParticle.getProcess() == 4) { // Particle deday - histos.fill(HIST(hPtDecDen[histogramIndex]), mcParticle.pt()); + h.fill(HIST(hPtGeneratedStr[histogramIndex]), mcParticle.pt()); } else { // Material - histos.fill(HIST(hPtMatDen[histogramIndex]), mcParticle.pt()); + h.fill(HIST(hPtGeneratedMat[histogramIndex]), mcParticle.pt()); } } - histos.fill(HIST(hEtaDen[histogramIndex]), mcParticle.eta()); - histos.fill(HIST(hYDen[histogramIndex]), mcParticle.y()); - histos.fill(HIST(hPhiDen[histogramIndex]), mcParticle.phi()); - histos.fill(HIST(hPtEtaDen[histogramIndex]), mcParticle.pt(), mcParticle.eta()); + h.fill(HIST(hEtaGenerated[histogramIndex]), mcParticle.eta()); + h.fill(HIST(hYGenerated[histogramIndex]), mcParticle.y()); + h.fill(HIST(hPhiGenerated[histogramIndex]), mcParticle.phi()); + if (doPtEta) { + h.fill(HIST(hPtEtaGenerated[histogramIndex]), mcParticle.pt(), mcParticle.eta()); + } } - template - void fillMCEfficiency() + template + void fillMCEfficiency(const bool doMakeHistograms) { - if (!makeEff) { + if (!doMakeHistograms) { return; } - if (!doSumPDG) { + + static_assert(charge == 0 || charge == 1); + if constexpr (charge == 0) { + if (!doPositivePDG) { + return; + } + } else { + if (!doNegativePDG) { + return; + } + } + if (!makeEff) { return; } - const char* partName = id == o2::track::PID::NIDs ? "All" : o2::track::PID::getName(id); + + HistogramRegistry* registry = &histosPos; + if (charge == 1) { + registry = &histosNeg; + } + + constexpr int histogramIndex = id + charge * nSpecies; + + const char* partName = particleName(charge, id); LOG(debug) << "Filling efficiency for particle " << static_cast(id) << " " << partName; - TList* subList = static_cast(listEfficiencyMC->FindObject(partName)); + THashList* subList = static_cast(listEfficiencyMC->FindObject(partName)); if (!subList) { LOG(warning) << "Cannot find list of efficiency objects for particle " << partName; return; } - auto doFillEfficiency = [&](TString effname, auto num, auto den) { - effname = partName + effname; + // Filling 1D efficiencies + auto doFillEfficiency = [&](const TString effname, auto num, auto den) { TEfficiency* eff = static_cast(subList->FindObject(effname)); if (!eff) { LOG(warning) << "Cannot find TEfficiency " << effname; return; } - eff->SetTotalHistogram(*histos.get(den).get(), "f"); - eff->SetPassedHistogram(*histos.get(num).get(), "f"); + eff->SetTotalHistogram(*registry->get(den).get(), "f"); + eff->SetPassedHistogram(*registry->get(num).get(), "f"); }; - doFillEfficiency("efficiencyVsPt", HIST(hPtNum[id]), HIST(hPtDen[id])); - doFillEfficiency("efficiencyVsPtPrm", HIST(hPtPrmNum[id]), HIST(hPtPrmDen[id])); - doFillEfficiency("efficiencyVsPtDec", HIST(hPtDecNum[id]), HIST(hPtDecDen[id])); - doFillEfficiency("efficiencyVsPtMat", HIST(hPtMatNum[id]), HIST(hPtMatDen[id])); - doFillEfficiency("efficiencyVsP", HIST(hPNum[id]), HIST(hPDen[id])); - doFillEfficiency("efficiencyVsEta", HIST(hEtaNum[id]), HIST(hEtaDen[id])); - doFillEfficiency("efficiencyVsPhi", HIST(hPhiNum[id]), HIST(hPhiDen[id])); - auto fillEfficiency2D = [&](TString effname, auto num, auto den) { - effname = partName + effname; + doFillEfficiency("ITS_vsPt", HIST(hPtIts[histogramIndex]), HIST(hPtGenerated[histogramIndex])); + doFillEfficiency("TPC_vsPt", HIST(hPtTpc[histogramIndex]), HIST(hPtGenerated[histogramIndex])); + doFillEfficiency("ITS-TPC_vsPt", HIST(hPtItsTpc[histogramIndex]), HIST(hPtGenerated[histogramIndex])); + doFillEfficiency("ITS-TOF_vsPt", HIST(hPtItsTof[histogramIndex]), HIST(hPtGenerated[histogramIndex])); + doFillEfficiency("Tpc-TOF_vsPt", HIST(hPtTpcTof[histogramIndex]), HIST(hPtGenerated[histogramIndex])); + doFillEfficiency("ITS-TPC-TOF_vsPt", HIST(hPtItsTpcTof[histogramIndex]), HIST(hPtGenerated[histogramIndex])); + doFillEfficiency("ITS-TPC_vsPt_Trk", HIST(hPtTrkItsTpc[histogramIndex]), HIST(hPtGenerated[histogramIndex])); + + doFillEfficiency("ITS_vsPt_Prm", HIST(hPtItsPrm[histogramIndex]), HIST(hPtGeneratedPrm[histogramIndex])); + doFillEfficiency("ITS-TPC_vsPt_Prm", HIST(hPtItsTpcPrm[histogramIndex]), HIST(hPtGeneratedPrm[histogramIndex])); + doFillEfficiency("ITS-TPC_vsPt_Prm_Trk", HIST(hPtTrkItsTpcPrm[histogramIndex]), HIST(hPtGeneratedPrm[histogramIndex])); + doFillEfficiency("ITS-TPC-TOF_vsPt_Prm", HIST(hPtItsTpcTofPrm[histogramIndex]), HIST(hPtGeneratedPrm[histogramIndex])); + + doFillEfficiency("ITS-TPC_vsPt_Str", HIST(hPtItsTpcStr[histogramIndex]), HIST(hPtGeneratedStr[histogramIndex])); + doFillEfficiency("ITS-TPC_vsPt_Str_Trk", HIST(hPtTrkItsTpcStr[histogramIndex]), HIST(hPtGeneratedStr[histogramIndex])); + doFillEfficiency("ITS-TPC-TOF_vsPt_Str", HIST(hPtItsTpcTofStr[histogramIndex]), HIST(hPtGeneratedStr[histogramIndex])); + + doFillEfficiency("ITS-TPC_vsPt_Mat", HIST(hPtItsTpcMat[histogramIndex]), HIST(hPtGeneratedMat[histogramIndex])); + doFillEfficiency("ITS-TPC_vsPt_Mat_Trk", HIST(hPtTrkItsTpcMat[histogramIndex]), HIST(hPtGeneratedMat[histogramIndex])); + doFillEfficiency("ITS-TPC-TOF_vsPt_Mat", HIST(hPtItsTpcTofMat[histogramIndex]), HIST(hPtGeneratedMat[histogramIndex])); + + doFillEfficiency("ITS-TPC_vsP", HIST(hPItsTpc[histogramIndex]), HIST(hPGenerated[histogramIndex])); + doFillEfficiency("ITS-TPC_vsP_Trk", HIST(hPTrkItsTpc[histogramIndex]), HIST(hPGenerated[histogramIndex])); + doFillEfficiency("ITS-TPC-TOF_vsP", HIST(hPItsTpcTof[histogramIndex]), HIST(hPGenerated[histogramIndex])); + + doFillEfficiency("ITS-TPC_vsEta", HIST(hEtaItsTpc[histogramIndex]), HIST(hEtaGenerated[histogramIndex])); + doFillEfficiency("ITS-Tpc_vsEta_Trk", HIST(hEtaTrkItsTpc[histogramIndex]), HIST(hEtaGenerated[histogramIndex])); + doFillEfficiency("ITS-TPC-TOF_vsEta", HIST(hEtaItsTpcTof[histogramIndex]), HIST(hEtaGenerated[histogramIndex])); + + doFillEfficiency("ITS-TPC_vsY", HIST(hYItsTpc[histogramIndex]), HIST(hYGenerated[histogramIndex])); + doFillEfficiency("ITS-TPC-TOF_vsY", HIST(hYItsTpcTof[histogramIndex]), HIST(hYGenerated[histogramIndex])); + + doFillEfficiency("ITS-TPC_vsPhi", HIST(hPhiItsTpc[histogramIndex]), HIST(hPhiGenerated[histogramIndex])); + doFillEfficiency("ITS-TPC_vsPhi_Trk", HIST(hPhiTrkItsTpc[histogramIndex]), HIST(hPhiGenerated[histogramIndex])); + doFillEfficiency("ITS-TPC-TOF_vsPhi", HIST(hPhiItsTpcTof[histogramIndex]), HIST(hPhiGenerated[histogramIndex])); + + if (!doPtEta) { + return; + } + + // Filling 2D efficiencies + auto fillEfficiency2D = [&](const TString effname, auto num, auto den) { TEfficiency* eff = static_cast(subList->FindObject(effname)); if (!eff) { LOG(warning) << "Cannot find TEfficiency " << effname; return; } - eff->SetTotalHistogram(*histos.get(den).get(), "f"); - eff->SetPassedHistogram(*histos.get(num).get(), "f"); + eff->SetTotalHistogram(*registry->get(den).get(), "f"); + eff->SetPassedHistogram(*registry->get(num).get(), "f"); }; - fillEfficiency2D("efficiencyVsPtVsEta", HIST(hPtEtaNum[id]), HIST(hPtEtaDen[id])); + fillEfficiency2D("ITS-TPC_vsPt_vsEta", HIST(hPtEtaItsTpc[histogramIndex]), HIST(hPtEtaGenerated[histogramIndex])); + fillEfficiency2D("ITS-TPC_vsPt_vsEta_Trk", HIST(hPtEtaTrkItsTpc[histogramIndex]), HIST(hPtEtaGenerated[histogramIndex])); + fillEfficiency2D("ITS-TPC-TOF_vsPt_vsEta", HIST(hPtEtaItsTpcTof[histogramIndex]), HIST(hPtEtaGenerated[histogramIndex])); } template @@ -1087,6 +1214,7 @@ struct QaEfficiency { } return true; } + // Global process void process(o2::soa::Join::iterator const& collision, const o2::soa::Join& tracks) @@ -1094,253 +1222,236 @@ struct QaEfficiency { isCollisionSelected(collision); } - // Function to apply track selection - template - bool isTrackSelected(trackType track) + // Function to apply particle selection + template + bool isInAcceptance(const particleType& particle, const histoType& countingHisto, const int offset = 0) { - switch (trackSelection.value) { - case 0: - return true; - case 1: - return track.isGlobalTrack(); - case 2: - return track.isGlobalTrackWoPtEta(); - case 3: - return track.isGlobalTrackWoDCA(); - case 4: - return track.isQualityTrack(); - case 5: - return track.isInAcceptanceTrack(); + if ((particle.pt() < ptMin || particle.pt() > ptMax)) { // Check pt + return false; } - return false; - } - - // MC process - void processMC(const o2::aod::McParticles& mcParticles, - const o2::soa::Join& collisions, - const o2::soa::Join& tracks, - const o2::aod::McCollisions&) - { - - std::vector recoEvt(collisions.size()); - int nevts = 0; - for (const auto& collision : collisions) { - if (!isCollisionSelected(collision)) { - continue; + histos.fill(countingHisto, 1 + offset); + if ((particle.eta() < etaMin || particle.eta() > etaMax)) { // Check eta + return false; + } + histos.fill(countingHisto, 2 + offset); + if ((particle.phi() < phiMin || particle.phi() > phiMax)) { // Check phi + return false; + } + histos.fill(countingHisto, 3 + offset); + if constexpr (isMC) { + if ((particle.y() < yMin || particle.y() > yMax)) { // Check rapidity + return false; } - recoEvt[nevts++] = collision.mcCollision().globalIndex(); + histos.fill(countingHisto, 4 + offset); } - recoEvt.resize(nevts); - auto rejectParticle = [&](const auto& p, auto h, const int& offset = 0) { - histos.fill(h, 1 + offset); - const auto evtReconstructed = std::find(recoEvt.begin(), recoEvt.end(), p.mcCollision().globalIndex()) != recoEvt.end(); - if (!evtReconstructed) { // Check that the event is reconstructed - return true; - } + return true; + } - histos.fill(h, 2 + offset); - if ((p.pt() < ptMin || p.pt() > ptMax)) { // Check pt - return true; - } - histos.fill(h, 3 + offset); - if ((p.eta() < etaMin || p.eta() > etaMax)) { // Check eta - return true; - } - histos.fill(h, 4 + offset); - if ((p.phi() < phiMin || p.phi() > phiMax)) { // Check phi - return true; - } - histos.fill(h, 5 + offset); - if ((p.y() < yMin || p.y() > yMax)) { // Check rapidity - return true; - } - histos.fill(h, 6 + offset); + // Function to apply track selection + bool passedITS = false; + bool passedTPC = false; + bool passedTOF = false; + template + bool isTrackSelected(trackType& track, const histoType& countingHisto) + { + // Reset selections + passedITS = false; + passedTPC = false; + passedTOF = false; - return false; - }; + histos.fill(countingHisto, 1); // Read tracks - // Track loop - for (const auto& track : tracks) { - histos.fill(HIST("MC/trackSelection"), 1); + if constexpr (isMC) { // MC only if (!track.has_mcParticle()) { histos.fill(HIST("MC/fakeTrackNoiseHits"), 0.5); - continue; + return false; } + histos.fill(countingHisto, 2); // Tracks with particles (i.e. no fakes) const auto mcParticle = track.mcParticle(); - if (rejectParticle(mcParticle, HIST("MC/trackSelection"), 1)) { - continue; + if (!isInAcceptance(mcParticle, countingHisto, 2)) { + return false; } - if (noFakes) { // Selecting tracks with no fake hits - bool hasFake = false; + if (noFakesHits) { // Selecting tracks with no fake hits + bool hasFakeHit = false; for (int i = 0; i < 10; i++) { // From ITS to TPC if (track.mcMask() & 1 << i) { - hasFake = true; + hasFakeHit = true; break; } } - if (hasFake) { - continue; + if (hasFakeHit) { + return false; } } - - histos.fill(HIST("MC/trackSelection"), 10); - if (!isTrackSelected(track)) { // Check general cuts - continue; - } - histos.fill(HIST("MC/trackSelection"), 9); - if (!track.has_collision()) { - continue; - } - histos.fill(HIST("MC/trackSelection"), 10); - // Filling variable histograms - histos.fill(HIST("MC/trackLength"), track.length()); - if (doEl) { - fillMCTrackHistograms<0, o2::track::PID::Electron>(track); - fillMCTrackHistograms<1, o2::track::PID::Electron>(track); - fillMCTrackHistograms<2, o2::track::PID::Electron>(track); - } - if (doMu) { - fillMCTrackHistograms<0, o2::track::PID::Muon>(track); - fillMCTrackHistograms<1, o2::track::PID::Muon>(track); - fillMCTrackHistograms<2, o2::track::PID::Muon>(track); + histos.fill(countingHisto, 7); + } else { // Data only + if (!isInAcceptance(track, countingHisto, 2)) { + return false; } - if (doPi) { - fillMCTrackHistograms<0, o2::track::PID::Pion>(track); - fillMCTrackHistograms<1, o2::track::PID::Pion>(track); - fillMCTrackHistograms<2, o2::track::PID::Pion>(track); + } + + if (!track.has_collision()) { + return false; + } + histos.fill(countingHisto, 8); + + if (trackSelection) { // Check general cuts + if (!track.passedTrackType()) { + return false; } - if (doKa) { - fillMCTrackHistograms<0, o2::track::PID::Kaon>(track); - fillMCTrackHistograms<1, o2::track::PID::Kaon>(track); - fillMCTrackHistograms<2, o2::track::PID::Kaon>(track); + histos.fill(countingHisto, 9); + if (!track.passedPtRange()) { + return false; } - if (doPr) { - fillMCTrackHistograms<0, o2::track::PID::Proton>(track); - fillMCTrackHistograms<1, o2::track::PID::Proton>(track); - fillMCTrackHistograms<2, o2::track::PID::Proton>(track); + histos.fill(countingHisto, 10); + if (!track.passedEtaRange()) { + return false; } - if (doDe) { - fillMCTrackHistograms<0, o2::track::PID::Deuteron>(track); - fillMCTrackHistograms<1, o2::track::PID::Deuteron>(track); - fillMCTrackHistograms<2, o2::track::PID::Deuteron>(track); + histos.fill(countingHisto, 11); + if (!track.passedDCAxy()) { + return false; } - if (doTr) { - fillMCTrackHistograms<0, o2::track::PID::Triton>(track); - fillMCTrackHistograms<1, o2::track::PID::Triton>(track); - fillMCTrackHistograms<2, o2::track::PID::Triton>(track); + histos.fill(countingHisto, 12); + if (!track.passedDCAz()) { + return false; } - if (doHe) { - fillMCTrackHistograms<0, o2::track::PID::Helium3>(track); - fillMCTrackHistograms<1, o2::track::PID::Helium3>(track); - fillMCTrackHistograms<2, o2::track::PID::Helium3>(track); + histos.fill(countingHisto, 13); + if (!track.passedGoldenChi2()) { + return false; } - if (doAl) { - fillMCTrackHistograms<0, o2::track::PID::Alpha>(track); - fillMCTrackHistograms<1, o2::track::PID::Alpha>(track); - fillMCTrackHistograms<2, o2::track::PID::Alpha>(track); + histos.fill(countingHisto, 14); + + passedITS = track.passedITSNCls() && + track.passedITSChi2NDF() && + track.passedITSRefit() && + track.passedITSHits() && + track.hasITS(); + + passedTPC = track.passedTPCNCls() && + track.passedTPCCrossedRows() && + track.passedTPCCrossedRowsOverNCls() && + track.passedTPCChi2NDF() && + track.passedTPCRefit() && + track.hasTPC(); + passedTOF = track.hasTOF(); + } else { + passedITS = track.hasITS(); + passedTPC = track.hasTPC(); + passedTOF = track.hasTOF(); + } + + if (passedITS) { // Partial + histos.fill(countingHisto, 15); + } + + if (passedTPC) { // Partial + histos.fill(countingHisto, 16); + } + + if (passedTOF) { // Partial + histos.fill(countingHisto, 17); + } + + switch (globalTrackSelection) { + case 0: + return true; + case 1: + return track.isGlobalTrack(); + case 2: + return track.isGlobalTrackWoPtEta(); + case 3: + return track.isGlobalTrackWoDCA(); + case 4: + return track.isQualityTrack(); + case 5: + return track.isInAcceptanceTrack(); + default: + LOG(fatal) << "Can't interpret track asked selection"; + } + histos.fill(countingHisto, 18); + + return false; + } + + // MC process + Preslice perCollision = o2::aod::track::collisionId; + void processMC(o2::aod::McCollision const& mcCollision, + o2::soa::SmallGroups> const& collisions, + o2::soa::Join const& tracks, + o2::aod::McParticles const& mcParticles) + { + if (collisions.size() < 1) { // Skipping MC events that have no reconstructed collisions + return; + } + + for (const auto& collision : collisions) { + if (!isCollisionSelected(collision)) { + continue; } - if (doUnId) { - fillMCTrackHistograms<0, o2::track::PID::NIDs>(track); - fillMCTrackHistograms<1, o2::track::PID::NIDs>(track); - fillMCTrackHistograms<2, o2::track::PID::NIDs>(track); + const auto groupedTracks = tracks.sliceBy(perCollision, collision.globalIndex()); + + // Track loop + for (const auto& track : groupedTracks) { + if (!isTrackSelected(track, HIST("MC/trackSelection"))) { + continue; + } + // Filling variable histograms + histos.fill(HIST("MC/trackLength"), track.length()); + static_for<0, 1>([&](auto charge) { + fillMCTrackHistograms(track, doEl); + fillMCTrackHistograms(track, doMu); + fillMCTrackHistograms(track, doPi); + fillMCTrackHistograms(track, doKa); + fillMCTrackHistograms(track, doPr); + fillMCTrackHistograms(track, doDe); + fillMCTrackHistograms(track, doTr); + fillMCTrackHistograms(track, doHe); + fillMCTrackHistograms(track, doAl); + fillMCTrackHistograms(track, doUnId); + }); } } - float dNdEta = 0; - for (const auto& mcParticle : mcParticles) { // Loop on particles to fill the denominator + // Loop on particles to fill the denominator + float dNdEta = 0; // Multiplicity + for (const auto& mcParticle : mcParticles) { if (TMath::Abs(mcParticle.eta()) <= 2.f && !mcParticle.has_daughters()) { dNdEta += 1.f; } - if (rejectParticle(mcParticle, HIST("MC/particleSelection"))) { + if (!isInAcceptance(mcParticle, HIST("MC/particleSelection"))) { continue; } - if (doEl) { - fillMCParticleHistograms<0, o2::track::PID::Electron>(mcParticle); - fillMCParticleHistograms<1, o2::track::PID::Electron>(mcParticle); - fillMCParticleHistograms<2, o2::track::PID::Electron>(mcParticle); - } - if (doMu) { - fillMCParticleHistograms<0, o2::track::PID::Muon>(mcParticle); - fillMCParticleHistograms<1, o2::track::PID::Muon>(mcParticle); - fillMCParticleHistograms<2, o2::track::PID::Muon>(mcParticle); - } - if (doPi) { - fillMCParticleHistograms<0, o2::track::PID::Pion>(mcParticle); - fillMCParticleHistograms<1, o2::track::PID::Pion>(mcParticle); - fillMCParticleHistograms<2, o2::track::PID::Pion>(mcParticle); - } - if (doKa) { - fillMCParticleHistograms<0, o2::track::PID::Kaon>(mcParticle); - fillMCParticleHistograms<1, o2::track::PID::Kaon>(mcParticle); - fillMCParticleHistograms<2, o2::track::PID::Kaon>(mcParticle); - } - if (doPr) { - fillMCParticleHistograms<0, o2::track::PID::Proton>(mcParticle); - fillMCParticleHistograms<1, o2::track::PID::Proton>(mcParticle); - fillMCParticleHistograms<2, o2::track::PID::Proton>(mcParticle); - } - if (doDe) { - fillMCParticleHistograms<0, o2::track::PID::Deuteron>(mcParticle); - fillMCParticleHistograms<1, o2::track::PID::Deuteron>(mcParticle); - fillMCParticleHistograms<2, o2::track::PID::Deuteron>(mcParticle); - } - if (doTr) { - fillMCParticleHistograms<0, o2::track::PID::Triton>(mcParticle); - fillMCParticleHistograms<1, o2::track::PID::Triton>(mcParticle); - fillMCParticleHistograms<2, o2::track::PID::Triton>(mcParticle); - } - if (doHe) { - fillMCParticleHistograms<0, o2::track::PID::Helium3>(mcParticle); - fillMCParticleHistograms<1, o2::track::PID::Helium3>(mcParticle); - fillMCParticleHistograms<2, o2::track::PID::Helium3>(mcParticle); - } - if (doAl) { - fillMCParticleHistograms<0, o2::track::PID::Alpha>(mcParticle); - fillMCParticleHistograms<1, o2::track::PID::Alpha>(mcParticle); - fillMCParticleHistograms<2, o2::track::PID::Alpha>(mcParticle); - } - if (doUnId) { - fillMCParticleHistograms<0, o2::track::PID::NIDs>(mcParticle); - fillMCParticleHistograms<1, o2::track::PID::NIDs>(mcParticle); - fillMCParticleHistograms<2, o2::track::PID::NIDs>(mcParticle); - } + static_for<0, 1>([&](auto charge) { + fillMCParticleHistograms(mcParticle, doEl); + fillMCParticleHistograms(mcParticle, doMu); + fillMCParticleHistograms(mcParticle, doPi); + fillMCParticleHistograms(mcParticle, doKa); + fillMCParticleHistograms(mcParticle, doPr); + fillMCParticleHistograms(mcParticle, doDe); + fillMCParticleHistograms(mcParticle, doTr); + fillMCParticleHistograms(mcParticle, doHe); + fillMCParticleHistograms(mcParticle, doAl); + fillMCParticleHistograms(mcParticle, doUnId); + }); } histos.fill(HIST("MC/eventMultiplicity"), dNdEta * 0.5f / 2.f); // Fill TEfficiencies - if (doEl) { - fillMCEfficiency(); - } - if (doMu) { - fillMCEfficiency(); - } - if (doPi) { - fillMCEfficiency(); - } - if (doKa) { - fillMCEfficiency(); - } - if (doPr) { - fillMCEfficiency(); - } - if (doDe) { - fillMCEfficiency(); - } - if (doTr) { - fillMCEfficiency(); - } - if (doHe) { - fillMCEfficiency(); - } - if (doAl) { - fillMCEfficiency(); - } - if (doUnId) { - fillMCEfficiency(); - } + static_for<0, 1>([&](auto charge) { + fillMCEfficiency(doEl); + fillMCEfficiency(doMu); + fillMCEfficiency(doPi); + fillMCEfficiency(doKa); + fillMCEfficiency(doPr); + fillMCEfficiency(doDe); + fillMCEfficiency(doTr); + fillMCEfficiency(doHe); + fillMCEfficiency(doAl); + fillMCEfficiency(doUnId); + }); } PROCESS_SWITCH(QaEfficiency, processMC, "process MC", false); @@ -1352,139 +1463,62 @@ struct QaEfficiency { return; } - bool passedITSCuts = true; - bool passedTPCCuts = true; for (const auto& track : tracks) { - histos.fill(HIST("Data/trackSelection"), 1); - if ((track.pt() < ptMin || track.pt() > ptMax)) { // Check pt + if (!isTrackSelected(track, HIST("Data/trackSelection"))) { continue; } - histos.fill(HIST("Data/trackSelection"), 2); - if ((track.eta() < etaMin || track.eta() > etaMax)) { // Check eta - continue; - } - histos.fill(HIST("Data/trackSelection"), 3); - if ((track.phi() < phiMin || track.phi() > phiMax)) { // Check phi - continue; - } - histos.fill(HIST("Data/trackSelection"), 4); - if (trackSelection.value > 0) { // Check general cuts - if (!track.passedTrackType()) { - continue; - } - histos.fill(HIST("Data/trackSelection"), 5); - if (!track.passedPtRange()) { - continue; - } - histos.fill(HIST("Data/trackSelection"), 6); - if (!track.passedEtaRange()) { - continue; - } - histos.fill(HIST("Data/trackSelection"), 7); - if (!track.passedDCAxy()) { - continue; - } - histos.fill(HIST("Data/trackSelection"), 8); - if (!track.passedDCAz()) { - continue; - } - histos.fill(HIST("Data/trackSelection"), 9); - if (!track.passedGoldenChi2()) { - continue; - } - histos.fill(HIST("Data/trackSelection"), 10); - - passedITSCuts = track.passedITSNCls() && - track.passedITSChi2NDF() && - track.passedITSRefit() && - track.passedITSHits() && - track.hasITS(); - - passedTPCCuts = track.passedTPCNCls() && - track.passedTPCCrossedRows() && - track.passedTPCCrossedRowsOverNCls() && - track.passedTPCChi2NDF() && - track.passedTPCRefit() && - track.hasTPC(); - } else { - passedITSCuts = track.hasITS(); - passedTPCCuts = track.hasTPC(); - } - - histos.fill(HIST("Data/trackSelection"), 11); histos.fill(HIST("Data/trackLength"), track.length()); - if (passedITSCuts) { - histos.fill(HIST("Data/sum/pt/its"), track.pt()); - histos.fill(HIST("Data/sum/eta/its"), track.eta()); - histos.fill(HIST("Data/sum/phi/its"), track.phi()); - histos.fill(HIST("Data/sum/etaphi/its"), track.eta(), track.phi()); - } - if (passedTPCCuts) { - histos.fill(HIST("Data/sum/pt/tpc"), track.pt()); - histos.fill(HIST("Data/sum/eta/tpc"), track.eta()); - histos.fill(HIST("Data/sum/phi/tpc"), track.phi()); - histos.fill(HIST("Data/sum/etaphi/tpc"), track.eta(), track.phi()); - } - if (passedITSCuts && passedTPCCuts) { - histos.fill(HIST("Data/sum/pt/its_tpc"), track.pt()); - histos.fill(HIST("Data/sum/eta/its_tpc"), track.eta()); - histos.fill(HIST("Data/sum/phi/its_tpc"), track.phi()); - histos.fill(HIST("Data/sum/etaphi/its_tpc"), track.eta(), track.phi()); - } - if (passedITSCuts && passedTPCCuts && track.hasTOF()) { - histos.fill(HIST("Data/sum/pt/its_tpc_tof"), track.pt()); - histos.fill(HIST("Data/sum/eta/its_tpc_tof"), track.eta()); - histos.fill(HIST("Data/sum/phi/its_tpc_tof"), track.phi()); - histos.fill(HIST("Data/sum/etaphi/its_tpc_tof"), track.eta(), track.phi()); - } - - if (track.sign() > 0) { - if (passedITSCuts) { + if (passedITS) { + if (track.sign() > 0) { histos.fill(HIST("Data/pos/pt/its"), track.pt()); histos.fill(HIST("Data/pos/eta/its"), track.eta()); histos.fill(HIST("Data/pos/phi/its"), track.phi()); histos.fill(HIST("Data/pos/etaphi/its"), track.eta(), track.phi()); - } - if (passedTPCCuts) { - histos.fill(HIST("Data/pos/pt/tpc"), track.pt()); - histos.fill(HIST("Data/pos/eta/tpc"), track.eta()); - histos.fill(HIST("Data/pos/phi/tpc"), track.phi()); - histos.fill(HIST("Data/pos/etaphi/tpc"), track.eta(), track.phi()); - } - if (passedITSCuts && passedTPCCuts) { - histos.fill(HIST("Data/pos/pt/its_tpc"), track.pt()); - histos.fill(HIST("Data/pos/eta/its_tpc"), track.eta()); - histos.fill(HIST("Data/pos/phi/its_tpc"), track.phi()); - histos.fill(HIST("Data/pos/etaphi/its_tpc"), track.eta(), track.phi()); - } - if (track.hasITS() && passedTPCCuts && track.hasTOF()) { - histos.fill(HIST("Data/pos/pt/its_tpc_tof"), track.pt()); - histos.fill(HIST("Data/pos/eta/its_tpc_tof"), track.eta()); - histos.fill(HIST("Data/pos/phi/its_tpc_tof"), track.phi()); - histos.fill(HIST("Data/pos/etaphi/its_tpc_tof"), track.eta(), track.phi()); - } - } else { - if (passedITSCuts) { + } else { histos.fill(HIST("Data/neg/pt/its"), track.pt()); histos.fill(HIST("Data/neg/eta/its"), track.eta()); histos.fill(HIST("Data/neg/phi/its"), track.phi()); histos.fill(HIST("Data/neg/etaphi/its"), track.eta(), track.phi()); } - if (passedTPCCuts) { + } + + if (passedTPC) { + if (track.sign() > 0) { + histos.fill(HIST("Data/pos/pt/tpc"), track.pt()); + histos.fill(HIST("Data/pos/eta/tpc"), track.eta()); + histos.fill(HIST("Data/pos/phi/tpc"), track.phi()); + histos.fill(HIST("Data/pos/etaphi/tpc"), track.eta(), track.phi()); + } else { histos.fill(HIST("Data/neg/pt/tpc"), track.pt()); histos.fill(HIST("Data/neg/eta/tpc"), track.eta()); histos.fill(HIST("Data/neg/phi/tpc"), track.phi()); histos.fill(HIST("Data/neg/etaphi/tpc"), track.eta(), track.phi()); } - if (passedITSCuts && passedTPCCuts) { + } + + if (passedITS && passedTPC) { + if (track.sign() > 0) { + histos.fill(HIST("Data/pos/pt/its_tpc"), track.pt()); + histos.fill(HIST("Data/pos/eta/its_tpc"), track.eta()); + histos.fill(HIST("Data/pos/phi/its_tpc"), track.phi()); + histos.fill(HIST("Data/pos/etaphi/its_tpc"), track.eta(), track.phi()); + } else { histos.fill(HIST("Data/neg/pt/its_tpc"), track.pt()); histos.fill(HIST("Data/neg/eta/its_tpc"), track.eta()); histos.fill(HIST("Data/neg/phi/its_tpc"), track.phi()); histos.fill(HIST("Data/neg/etaphi/its_tpc"), track.eta(), track.phi()); } - if (passedITSCuts && passedTPCCuts && track.hasTOF()) { + } + + if (passedITS && passedTPC && passedTOF) { + if (track.sign() > 0) { + histos.fill(HIST("Data/pos/pt/its_tpc_tof"), track.pt()); + histos.fill(HIST("Data/pos/eta/its_tpc_tof"), track.eta()); + histos.fill(HIST("Data/pos/phi/its_tpc_tof"), track.phi()); + histos.fill(HIST("Data/pos/etaphi/its_tpc_tof"), track.eta(), track.phi()); + } else { histos.fill(HIST("Data/neg/pt/its_tpc_tof"), track.pt()); histos.fill(HIST("Data/neg/eta/its_tpc_tof"), track.eta()); histos.fill(HIST("Data/neg/phi/its_tpc_tof"), track.phi()); @@ -1493,16 +1527,16 @@ struct QaEfficiency { } if (makeEff) { - if (passedITSCuts) { - static_cast(listEfficiencyData->At(0))->Fill(passedTPCCuts, track.pt()); + if (passedITS) { + static_cast(listEfficiencyData->At(0))->Fill(passedTPC, track.pt()); } - if (passedITSCuts && passedTPCCuts) { - static_cast(listEfficiencyData->At(1))->Fill(track.hasTOF(), track.pt()); - static_cast(listEfficiencyData->At(2))->Fill(track.hasTOF(), track.p()); - static_cast(listEfficiencyData->At(3))->Fill(track.hasTOF(), track.eta()); - static_cast(listEfficiencyData->At(4))->Fill(track.hasTOF(), track.phi()); - static_cast(listEfficiencyData->At(5))->Fill(track.hasTOF(), track.pt(), track.eta()); - static_cast(listEfficiencyData->At(6))->Fill(track.hasTOF(), track.pt(), track.phi()); + if (passedITS && passedTPC) { + static_cast(listEfficiencyData->At(1))->Fill(passedTOF, track.pt()); + static_cast(listEfficiencyData->At(2))->Fill(passedTOF, track.p()); + static_cast(listEfficiencyData->At(3))->Fill(passedTOF, track.eta()); + static_cast(listEfficiencyData->At(4))->Fill(passedTOF, track.phi()); + static_cast(listEfficiencyData->At(5))->Fill(passedTOF, track.pt(), track.eta()); + static_cast(listEfficiencyData->At(6))->Fill(passedTOF, track.pt(), track.phi()); } } } diff --git a/PWGLF/Tasks/spectraTOF.cxx b/PWGLF/Tasks/spectraTOF.cxx index ff0e45a07fe..603159e4a75 100644 --- a/PWGLF/Tasks/spectraTOF.cxx +++ b/PWGLF/Tasks/spectraTOF.cxx @@ -176,7 +176,7 @@ struct tofSpectra { void init(o2::framework::InitContext&) { - if (doprocessRun2 == true && doprocessRun2 == true) { + if (doprocessRun2 == true && doprocessRun3 == true) { LOGF(fatal, "Cannot enable processRun2 and processRun3 at the same time. Please choose one."); } if (doprocessFullEl == true && doprocessTinyEl == true) { @@ -493,13 +493,13 @@ struct tofSpectra { } } - template + template bool isEventSelected(CollisionType const& collision) { if constexpr (fillHistograms) { histos.fill(HIST("evsel"), 1); } - if (doprocessRun2 && !collision.sel7()) { + if (doprocessRun2 == true && !collision.sel7()) { return false; } else if (!collision.sel8()) {