From cb562b2fbd2efb4542c2f29eea54ed6821a30454 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Thu, 3 Feb 2022 16:36:25 +0100 Subject: [PATCH] Extend efficiency task - Add trk info + phi eta maps - Move to a sigle struct per charge --- DPG/Tasks/qaEfficiency.cxx | 777 +++++++++++++++++++++++-------------- 1 file changed, 478 insertions(+), 299 deletions(-) diff --git a/DPG/Tasks/qaEfficiency.cxx b/DPG/Tasks/qaEfficiency.cxx index 3370b83e212..be99319a07a 100644 --- a/DPG/Tasks/qaEfficiency.cxx +++ b/DPG/Tasks/qaEfficiency.cxx @@ -34,42 +34,21 @@ void customize(std::vector& workflowOptions) { std::vector options{ {"eff-data", VariantType::Int, 1, {"Efficiency for the data"}}, - {"eff-el", VariantType::Int, 0, {"Efficiency for the Electron PDG code"}}, - {"eff-mu", VariantType::Int, 0, {"Efficiency for the Muon PDG code"}}, - {"eff-pi", VariantType::Int, 0, {"Efficiency for the Pion PDG code"}}, - {"eff-ka", VariantType::Int, 0, {"Efficiency for the Kaon PDG code"}}, - {"eff-pr", VariantType::Int, 0, {"Efficiency for the Proton PDG code"}}, - {"eff-de", VariantType::Int, 0, {"Efficiency for the Deuteron PDG code"}}, - {"eff-tr", VariantType::Int, 0, {"Efficiency for the Triton PDG code"}}, - {"eff-he", VariantType::Int, 0, {"Efficiency for the Helium3 PDG code"}}, - {"eff-el-pos", VariantType::Int, 0, {"Efficiency for the Electron Positive PDG code"}}, - {"eff-mu-pos", VariantType::Int, 0, {"Efficiency for the Muon Positive PDG code"}}, - {"eff-pi-pos", VariantType::Int, 0, {"Efficiency for the Pion Positive PDG code"}}, - {"eff-ka-pos", VariantType::Int, 0, {"Efficiency for the Kaon Positive PDG code"}}, - {"eff-pr-pos", VariantType::Int, 0, {"Efficiency for the Proton Positive PDG code"}}, - {"eff-de-pos", VariantType::Int, 0, {"Efficiency for the Deuteron Positive PDG code"}}, - {"eff-tr-pos", VariantType::Int, 0, {"Efficiency for the Triton Positive PDG code"}}, - {"eff-he-pos", VariantType::Int, 0, {"Efficiency for the Helium3 Positive PDG code"}}, - {"eff-el-neg", VariantType::Int, 0, {"Efficiency for the Electron Negative PDG code"}}, - {"eff-mu-neg", VariantType::Int, 0, {"Efficiency for the Muon Negative PDG code"}}, - {"eff-pi-neg", VariantType::Int, 0, {"Efficiency for the Pion Negative PDG code"}}, - {"eff-ka-neg", VariantType::Int, 0, {"Efficiency for the Kaon Negative PDG code"}}, - {"eff-pr-neg", VariantType::Int, 0, {"Efficiency for the Proton Negative PDG code"}}, - {"eff-de-neg", VariantType::Int, 0, {"Efficiency for the Deuteron Negative PDG code"}}, - {"eff-tr-neg", VariantType::Int, 0, {"Efficiency for the Triton Negative PDG code"}}, - {"eff-he-neg", VariantType::Int, 0, {"Efficiency for the Helium3 Negative PDG code"}}}; + {"eff-mc", VariantType::Int, 0, {"Efficiency for the MC"}}, + {"eff-mc-pos", VariantType::Int, 0, {"Efficiency for the Electron Positive PDG code"}}, + {"eff-mc-neg", VariantType::Int, 0, {"Efficiency for the Electron Negative PDG code"}}}; std::swap(workflowOptions, options); } #include "Framework/runDataProcessing.h" /// Task to QA the efficiency of a particular particle defined by its pdg code -template -struct QaTrackingEfficiency { - static constexpr int nSpecies = 8; - static constexpr int PDGs[nSpecies] = {kElectron, kMuonMinus, kPiPlus, kKPlus, kProton, 1000010020, 1000010030, 1000020030}; - static_assert(particle < nSpecies && "Maximum of particles reached"); - static constexpr int pdg = PDGs[particle]; +// template +template +struct QaEfficiencyMc { + static constexpr int nSpecies = 9; + static constexpr const char* particleTitle[nSpecies] = {"e", "#mu", "#pi", "K", "p", "d", "t", "^{3}He", "#alpha"}; + static constexpr int PDGs[nSpecies] = {kElectron, kMuonMinus, kPiPlus, kKPlus, kProton, 1000010020, 1000010030, 1000020030, 1000020040}; // Particle selection Configurable etaMin{"eta-min", -3.f, "Lower limit in eta"}; Configurable etaMax{"eta-max", 3.f, "Upper limit in eta"}; @@ -81,6 +60,15 @@ struct QaTrackingEfficiency { Configurable ptMax{"pt-max", 5.f, "Upper limit in pT"}; Configurable selPrim{"sel-prim", 1, "1 select primaries, 0 select all particles"}; Configurable noFakes{"noFakes", false, "Flag to reject tracks that have fake hits"}; + Configurable doEl{"do-el", false, "Flag to run with the PDG code of pions"}; + Configurable doMu{"do-mu", false, "Flag to run with the PDG code of muons"}; + Configurable doPi{"do-pi", false, "Flag to run with the PDG code of pions"}; + Configurable doKa{"do-ka", false, "Flag to run with the PDG code of kaons"}; + Configurable doPr{"do-pr", false, "Flag to run with the PDG code of protons"}; + Configurable doDe{"do-de", false, "Flag to run with the PDG code of deuterons"}; + Configurable doTr{"do-tr", false, "Flag to run with the PDG code of tritons"}; + 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"}; // 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)"}; @@ -94,143 +82,345 @@ struct QaTrackingEfficiency { // Task configuration Configurable makeEff{"make-eff", false, "Flag to produce the efficiency with TEfficiency"}; - OutputObj list{"Efficiency"}; + OutputObj listEfficiency{"Efficiency"}; + // Histograms HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - - void init(InitContext&) + // Pt + static constexpr std::string_view hptnum[nSpecies] = {"el/pt/num", "mu/pt/num", "pi/pt/num", + "ka/pt/num", "pr/pt/num", "de/pt/num", + "tr/pt/num", "he/pt/num", "al/pt/num"}; + static constexpr std::string_view hptnumtrk[nSpecies] = {"el/pt/numtrk", "mu/pt/numtrk", "pi/pt/numtrk", + "ka/pt/numtrk", "pr/pt/numtrk", "de/pt/numtrk", + "tr/pt/numtrk", "he/pt/numtrk", "al/pt/numtrk"}; + static constexpr std::string_view hptnumtof[nSpecies] = {"el/pt/numtof", "mu/pt/numtof", "pi/pt/numtof", + "ka/pt/numtof", "pr/pt/numtof", "de/pt/numtof", + "tr/pt/numtof", "he/pt/numtof", "al/pt/numtof"}; + static constexpr std::string_view hptden[nSpecies] = {"el/pt/den", "mu/pt/den", "pi/pt/den", + "ka/pt/den", "pr/pt/den", "de/pt/den", + "tr/pt/den", "he/pt/den", "al/pt/den"}; + // P + static constexpr std::string_view hpnum[nSpecies] = {"el/p/num", "mu/p/num", "pi/p/num", + "ka/p/num", "pr/p/num", "de/p/num", + "tr/p/num", "he/p/num", "al/p/num"}; + static constexpr std::string_view hpnumtrk[nSpecies] = {"el/p/numtrk", "mu/p/numtrk", "pi/p/numtrk", + "ka/p/numtrk", "pr/p/numtrk", "de/p/numtrk", + "tr/p/numtrk", "he/p/numtrk", "al/p/numtrk"}; + static constexpr std::string_view hpnumtof[nSpecies] = {"el/p/numtof", "mu/p/numtof", "pi/p/numtof", + "ka/p/numtof", "pr/p/numtof", "de/p/numtof", + "tr/p/numtof", "he/p/numtof", "al/p/numtof"}; + static constexpr std::string_view hpden[nSpecies] = {"el/p/den", "mu/p/den", "pi/p/den", + "ka/p/den", "pr/p/den", "de/p/den", + "tr/p/den", "he/p/den", "al/p/den"}; + // Eta + static constexpr std::string_view hetanum[nSpecies] = {"el/eta/num", "mu/eta/num", "pi/eta/num", + "ka/eta/num", "pr/eta/num", "de/eta/num", + "tr/eta/num", "he/eta/num", "al/eta/num"}; + static constexpr std::string_view hetanumtrk[nSpecies] = {"el/eta/numtrk", "mu/eta/numtrk", "pi/eta/numtrk", + "ka/eta/numtrk", "pr/eta/numtrk", "de/eta/numtrk", + "tr/eta/numtrk", "he/eta/numtrk", "al/eta/numtrk"}; + static constexpr std::string_view hetanumtof[nSpecies] = {"el/eta/numtof", "mu/eta/numtof", "pi/eta/numtof", + "ka/eta/numtof", "pr/eta/numtof", "de/eta/numtof", + "tr/eta/numtof", "he/eta/numtof", "al/eta/numtof"}; + static constexpr std::string_view hetaden[nSpecies] = {"el/eta/den", "mu/eta/den", "pi/eta/den", + "ka/eta/den", "pr/eta/den", "de/eta/den", + "tr/eta/den", "he/eta/den", "al/eta/den"}; + // Y + static constexpr std::string_view hynum[nSpecies] = {"el/y/num", "mu/y/num", "pi/y/num", + "ka/y/num", "pr/y/num", "de/y/num", + "tr/y/num", "he/y/num", "al/y/num"}; + static constexpr std::string_view hynumtof[nSpecies] = {"el/y/numtof", "mu/y/numtof", "pi/y/numtof", + "ka/y/numtof", "pr/y/numtof", "de/y/numtof", + "tr/y/numtof", "he/y/numtof", "al/y/numtof"}; + static constexpr std::string_view hyden[nSpecies] = {"el/y/den", "mu/y/den", "pi/y/den", + "ka/y/den", "pr/y/den", "de/y/den", + "tr/y/den", "he/y/den", "al/y/den"}; + // Phi + static constexpr std::string_view hphinum[nSpecies] = {"el/phi/num", "mu/phi/num", "pi/phi/num", + "ka/phi/num", "pr/phi/num", "de/phi/num", + "tr/phi/num", "he/phi/num", "al/phi/num"}; + static constexpr std::string_view hphinumtrk[nSpecies] = {"el/phi/numtrk", "mu/phi/numtrk", "pi/phi/numtrk", + "ka/phi/numtrk", "pr/phi/numtrk", "de/phi/numtrk", + "tr/phi/numtrk", "he/phi/numtrk", "al/phi/numtrk"}; + static constexpr std::string_view hphinumtof[nSpecies] = {"el/phi/numtof", "mu/phi/numtof", "pi/phi/numtof", + "ka/phi/numtof", "pr/phi/numtof", "de/phi/numtof", + "tr/phi/numtof", "he/phi/numtof", "al/phi/numtof"}; + static constexpr std::string_view hphiden[nSpecies] = {"el/phi/den", "mu/phi/den", "pi/phi/den", + "ka/phi/den", "pr/phi/den", "de/phi/den", + "tr/phi/den", "he/phi/den", "al/phi/den"}; + // Eta-Phi + static constexpr std::string_view hptetanum[nSpecies] = {"el/pteta/num", "mu/pteta/num", "pi/pteta/num", + "ka/pteta/num", "pr/pteta/num", "de/pteta/num", + "tr/pteta/num", "he/pteta/num", "al/pteta/num"}; + static constexpr std::string_view hptetaden[nSpecies] = {"el/pteta/den", "mu/pteta/den", "pi/pteta/den", + "ka/pteta/den", "pr/pteta/den", "de/pteta/den", + "tr/pteta/den", "he/pteta/den", "al/pteta/den"}; + + template + void makeHistograms() { - if constexpr (pdgSign != 0 && pdgSign != 1 && pdgSign != -1) { - LOG(fatal) << "Provide pdgSign as 0, 1, -1. Provided: " << pdgSign; - } AxisSpec axisPt{ptBins, ptMin, ptMax, "#it{p}_{T} (GeV/#it{c})"}; - if (logPt) { - axisPt.makeLogaritmic(); - } AxisSpec axisP{ptBins, ptMin, ptMax, "#it{p} (GeV/#it{c})"}; if (logPt) { + axisPt.makeLogaritmic(); axisP.makeLogaritmic(); } 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 axisSel{20, 0.5, 20.5, "Selection"}; - histos.add("eventSelection", "Event Selection", kTH1D, {axisSel}); - histos.get(HIST("eventSelection"))->GetXaxis()->SetBinLabel(1, "Events read"); - histos.get(HIST("eventSelection"))->GetXaxis()->SetBinLabel(2, "Passed Contrib."); - histos.get(HIST("eventSelection"))->GetXaxis()->SetBinLabel(3, "Passed Position"); - histos.get(HIST("eventSelection"))->GetXaxis()->SetBinLabel(4, "Passed Ev. Sel."); - - histos.add("trackSelection", "Track Selection", kTH1D, {axisSel}); - histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(1, "Tracks read"); - histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(2, "Passed Ev. Reco."); - histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(3, "Passed #it{p}_{T}"); - histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(4, "Passed #it{#eta}"); - histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(5, "Passed #it{#varphi}"); - histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(6, "Passed y"); - histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(7, "Passed Prim."); - histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(8, Form("Passed PDG %i", pdg)); - histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(9, "Passed Prim. MC"); - histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(10, "Passed Fake"); - histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(11, "Passed standard quality cuts"); - histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(12, "Passed has collision"); - histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(13, "Passed hasTOF"); - histos.add("fakeTrackNoiseHits", "Fake tracks from noise hits", kTH1D, {{1, 0, 1}}); - - histos.add("partSelection", "Particle Selection", kTH1D, {axisSel}); - histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(1, "Particles read"); - histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(2, "Passed Ev. Reco."); - histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(3, "Passed #it{p}_{T}"); - histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(4, "Passed #it{#eta}"); - histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(5, "Passed #it{#varphi}"); - histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(6, "Passed y"); - histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(7, "Passed Prim."); - histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(8, Form("Passed PDG %i", pdg)); - histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(9, "Passed Prim. MC"); - - histos.add("eventMultiplicity", "Event Selection", kTH1D, {{1000, 0, 5000}}); - histos.add("trackLength", "Track length;Track length (cm)", kTH1D, {{2000, -1000, 1000}}); - const TString tagPt = Form("%s #it{#eta} [%.2f,%.2f] #it{y} [%.2f,%.2f] #it{#varphi} [%.2f,%.2f] Prim %i", - o2::track::pid_constants::sNames[particle], + o2::track::PID::getName(particle), etaMin.value, etaMax.value, yMin.value, yMax.value, phiMin.value, phiMax.value, selPrim.value); - histos.add("pt/num", "Numerator " + tagPt, kTH1D, {axisPt}); - histos.add("pt/numtof", "Numerator TOF " + tagPt, kTH1D, {axisPt}); - histos.add("pt/den", "Denominator " + tagPt, kTH1D, {axisPt}); + histos.add(hptnum[particle].data(), "Numerator " + tagPt, kTH1D, {axisPt}); + histos.add(hptnumtrk[particle].data(), "Numerator Track " + tagPt, kTH1D, {axisPt}); + histos.add(hptnumtof[particle].data(), "Numerator TOF " + tagPt, kTH1D, {axisPt}); + histos.add(hptden[particle].data(), "Denominator " + tagPt, kTH1D, {axisPt}); - histos.add("p/num", "Numerator " + tagPt, kTH1D, {axisP}); - histos.add("p/numtof", "Numerator TOF " + tagPt, kTH1D, {axisP}); - histos.add("p/den", "Denominator " + tagPt, kTH1D, {axisP}); + histos.add(hpnum[particle].data(), "Numerator " + tagPt, kTH1D, {axisP}); + histos.add(hpnumtrk[particle].data(), "Numerator Track " + tagPt, kTH1D, {axisP}); + histos.add(hpnumtof[particle].data(), "Numerator TOF " + tagPt, kTH1D, {axisP}); + histos.add(hpden[particle].data(), "Denominator " + tagPt, kTH1D, {axisP}); const TString tagEta = Form("%s #it{p}_{T} [%.2f,%.2f] #it{y} [%.2f,%.2f] #it{#varphi} [%.2f,%.2f] Prim %i", - o2::track::pid_constants::sNames[particle], + o2::track::PID::getName(particle), ptMin.value, ptMax.value, yMin.value, yMax.value, phiMin.value, phiMax.value, selPrim.value); - histos.add("eta/num", "Numerator " + tagEta, kTH1D, {axisEta}); - histos.add("eta/numtof", "Numerator TOF " + tagEta, kTH1D, {axisEta}); - histos.add("eta/den", "Denominator " + tagEta, kTH1D, {axisEta}); + histos.add(hetanum[particle].data(), "Numerator " + tagEta, kTH1D, {axisEta}); + histos.add(hetanumtrk[particle].data(), "Numerator Track " + tagEta, kTH1D, {axisEta}); + histos.add(hetanumtof[particle].data(), "Numerator TOF " + tagEta, kTH1D, {axisEta}); + histos.add(hetaden[particle].data(), "Denominator " + tagEta, kTH1D, {axisEta}); const TString tagY = Form("%s #it{p}_{T} [%.2f,%.2f] #it{#eta} [%.2f,%.2f] #it{#varphi} [%.2f,%.2f] Prim %i", - o2::track::pid_constants::sNames[particle], + o2::track::PID::getName(particle), ptMin.value, ptMax.value, etaMin.value, etaMax.value, phiMin.value, phiMax.value, selPrim.value); - histos.add("y/num", "Numerator " + tagY, kTH1D, {axisY}); - histos.add("y/numtof", "Numerator TOF " + tagY, kTH1D, {axisY}); - histos.add("y/den", "Denominator " + tagY, kTH1D, {axisY}); + histos.add(hynum[particle].data(), "Numerator " + tagY, kTH1D, {axisY}); + histos.add(hynumtof[particle].data(), "Numerator TOF " + tagY, kTH1D, {axisY}); + histos.add(hyden[particle].data(), "Denominator " + tagY, kTH1D, {axisY}); const TString tagPhi = Form("%s #it{p}_{T} [%.2f,%.2f] #it{#eta} [%.2f,%.2f] #it{y} [%.2f,%.2f] Prim %i", - o2::track::pid_constants::sNames[particle], + o2::track::PID::getName(particle), ptMin.value, ptMax.value, etaMin.value, etaMax.value, yMin.value, yMax.value, selPrim.value); - histos.add("phi/num", "Numerator " + tagPhi, kTH1D, {axisPhi}); - histos.add("phi/numtof", "Numerator TOF " + tagPhi, kTH1D, {axisPhi}); - histos.add("phi/den", "Denominator " + tagPhi, kTH1D, {axisPhi}); + histos.add(hphinum[particle].data(), "Numerator " + tagPhi, kTH1D, {axisPhi}); + histos.add(hphinumtrk[particle].data(), "Numerator Track " + tagPhi, kTH1D, {axisPhi}); + histos.add(hphinumtof[particle].data(), "Numerator TOF " + tagPhi, kTH1D, {axisPhi}); + histos.add(hphiden[particle].data(), "Denominator " + tagPhi, kTH1D, {axisPhi}); const TString tagPtEta = Form("%s #it{#varphi} [%.2f,%.2f] #it{y} [%.2f,%.2f] Prim %i", - o2::track::pid_constants::sNames[particle], + o2::track::PID::getName(particle), phiMin.value, phiMax.value, yMin.value, yMax.value, selPrim.value); - histos.add("pteta/num", "Numerator " + tagPtEta, kTH2D, {axisPt, axisEta}); - histos.add("pteta/den", "Denominator " + tagPtEta, kTH2D, {axisPt, axisEta}); + histos.add(hptetanum[particle].data(), "Numerator " + tagPtEta, kTH2D, {axisPt, axisEta}); + histos.add(hptetaden[particle].data(), "Denominator " + tagPtEta, kTH2D, {axisPt, axisEta}); - list.setObject(new TList); if (makeEff) { + TList* subList = new TList(); + subList->SetName(o2::track::PID::getName(particle)); + listEfficiency->Add(subList); auto makeEfficiency = [&](TString effname, TString efftitle, auto templateHisto) { + effname = o2::track::PID::getName(particle) + effname; const TAxis* axis = histos.get(templateHisto)->GetXaxis(); if (axis->IsVariableBinSize()) { - list->Add(new TEfficiency(effname, efftitle, axis->GetNbins(), axis->GetXbins()->GetArray())); + subList->Add(new TEfficiency(effname, efftitle, axis->GetNbins(), axis->GetXbins()->GetArray())); } else { - list->Add(new TEfficiency(effname, efftitle, axis->GetNbins(), axis->GetXmin(), axis->GetXmax())); + subList->Add(new TEfficiency(effname, efftitle, axis->GetNbins(), axis->GetXmin(), axis->GetXmax())); } }; - makeEfficiency("efficiencyVsPt", "Efficiency " + tagPt + ";#it{p}_{T} (GeV/#it{c});Efficiency", HIST("pt/num")); - makeEfficiency("efficiencyVsP", "Efficiency " + tagPt + ";#it{p} (GeV/#it{c});Efficiency", HIST("pt/num")); - makeEfficiency("efficiencyVsEta", "Efficiency " + tagEta + ";#it{#eta};Efficiency", HIST("eta/num")); - makeEfficiency("efficiencyVsPhi", "Efficiency " + tagPhi + ";#it{#varphi} (rad);Efficiency", HIST("phi/num")); + makeEfficiency("efficiencyVsPt", "Efficiency " + tagPt + ";#it{p}_{T} (GeV/#it{c});Efficiency", HIST(hptnum[particle])); + makeEfficiency("efficiencyVsP", "Efficiency " + tagPt + ";#it{p} (GeV/#it{c});Efficiency", HIST(hpnum[particle])); + makeEfficiency("efficiencyVsEta", "Efficiency " + tagEta + ";#it{#eta};Efficiency", HIST(hetanum[particle])); + makeEfficiency("efficiencyVsPhi", "Efficiency " + tagPhi + ";#it{#varphi} (rad);Efficiency", HIST(hphinum[particle])); auto makeEfficiency2D = [&](TString effname, TString efftitle, auto templateHisto) { + effname = o2::track::PID::getName(particle) + effname; const TAxis* axisX = histos.get(templateHisto)->GetXaxis(); - const TAxis* axisY = histos.get(templateHisto)->GetXaxis(); + const TAxis* axisY = histos.get(templateHisto)->GetYaxis(); if (axisX->IsVariableBinSize() || axisY->IsVariableBinSize()) { - list->Add(new TEfficiency(effname, efftitle, axisX->GetNbins(), axisX->GetXbins()->GetArray(), axisY->GetNbins(), axisY->GetXbins()->GetArray())); + subList->Add(new TEfficiency(effname, efftitle, axisX->GetNbins(), axisX->GetXbins()->GetArray(), axisY->GetNbins(), axisY->GetXbins()->GetArray())); } else { - list->Add(new TEfficiency(effname, efftitle, axisX->GetNbins(), axisX->GetXmin(), axisX->GetXmax(), axisY->GetNbins(), axisY->GetXmin(), axisY->GetXmax())); + subList->Add(new TEfficiency(effname, efftitle, axisX->GetNbins(), axisX->GetXmin(), axisX->GetXmax(), axisY->GetNbins(), axisY->GetXmin(), axisY->GetXmax())); } }; - makeEfficiency2D("efficiencyVsPtVsEta", "Efficiency " + tagPtEta + ";#it{#varphi} (rad);Efficiency", HIST("pteta/num")); + makeEfficiency2D("efficiencyVsPtVsEta", "Efficiency " + tagPtEta + ";#it{#varphi} (rad);Efficiency", HIST(hptetanum[particle])); + } + } + + void init(InitContext&) + { + const AxisSpec axisSel{30, 0.5, 30.5, "Selection"}; + histos.add("eventSelection", "Event Selection", kTH1D, {axisSel}); + histos.get(HIST("eventSelection"))->GetXaxis()->SetBinLabel(1, "Events read"); + histos.get(HIST("eventSelection"))->GetXaxis()->SetBinLabel(2, "Passed Contrib."); + histos.get(HIST("eventSelection"))->GetXaxis()->SetBinLabel(3, "Passed Position"); + histos.get(HIST("eventSelection"))->GetXaxis()->SetBinLabel(4, "Passed Ev. Sel."); + + histos.add("trackSelection", "Track Selection", kTH1D, {axisSel}); + histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(1, "Tracks read"); + histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(2, "Passed has MC part."); + histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(3, "Passed Ev. Reco."); + histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(4, "Passed #it{p}_{T}"); + histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(5, "Passed #it{#eta}"); + histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(6, "Passed #it{#varphi}"); + histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(7, "Passed y"); + histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(8, "Passed Prim."); + histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(9, "Passed Prim. MC"); + histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(10, "Passed Fake"); + histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(11, "Passed standard quality cuts"); + histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(12, "Passed has collision"); + for (int i = 0; i < nSpecies; i++) { + histos.get(HIST("trackSelection"))->GetXaxis()->SetBinLabel(13 + i, Form("Passed PDG %i", PDGs[i])); + } + histos.add("fakeTrackNoiseHits", "Fake tracks from noise hits", kTH1D, {{1, 0, 1}}); + + histos.add("partSelection", "Particle Selection", kTH1D, {axisSel}); + histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(1, "Particles read"); + histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(2, "Passed Ev. Reco."); + histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(3, "Passed #it{p}_{T}"); + histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(4, "Passed #it{#eta}"); + histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(5, "Passed #it{#varphi}"); + histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(6, "Passed y"); + histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(7, "Passed Prim."); + histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(8, "Passed Prim. MC"); + for (int i = 0; i < nSpecies; i++) { + histos.get(HIST("partSelection"))->GetXaxis()->SetBinLabel(9 + i, Form("Passed PDG %i", PDGs[i])); + } + + histos.add("eventMultiplicity", "Event Selection", kTH1D, {{1000, 0, 5000}}); + histos.add("trackLength", "Track length;Track length (cm)", kTH1D, {{2000, -1000, 1000}}); + + listEfficiency.setObject(new TList); + if (doEl) { + makeHistograms(); + } + if (doMu) { + makeHistograms(); + } + if (doPi) { + makeHistograms(); + } + if (doKa) { + makeHistograms(); + } + if (doPr) { + makeHistograms(); + } + if (doDe) { + makeHistograms(); + } + if (doTr) { + makeHistograms(); + } + if (doHe) { + makeHistograms(); + } + if (doAl) { + makeHistograms(); } } + template + bool isPdgSelected(particleType mcParticle) + { + // Selecting PDG code + if constexpr (pdgSign == 0) { + if (abs(mcParticle.pdgCode()) != PDGs[particle]) { + return false; + } + } else if constexpr (pdgSign == 1) { + if (mcParticle.pdgCode() != PDGs[particle]) { + return false; + } + } else if constexpr (pdgSign == -1) { + if (mcParticle.pdgCode() != -PDGs[particle]) { + return false; + } + } + return true; + } + + template + void fillTrackHistograms(const trackType& track) + { + const auto mcParticle = track.mcParticle(); + + if (!isPdgSelected(mcParticle)) { // Selecting PDG code + return; + } + + histos.fill(HIST("trackSelection"), 13 + particle); + + histos.fill(HIST(hpnum[particle]), mcParticle.p()); + histos.fill(HIST(hptnum[particle]), mcParticle.pt()); + histos.fill(HIST(hetanum[particle]), mcParticle.eta()); + histos.fill(HIST(hynum[particle]), mcParticle.y()); + histos.fill(HIST(hphinum[particle]), mcParticle.phi()); + histos.fill(HIST(hptetanum[particle]), mcParticle.pt(), mcParticle.eta()); + + histos.fill(HIST(hpnumtrk[particle]), track.p()); + histos.fill(HIST(hptnumtrk[particle]), track.pt()); + histos.fill(HIST(hetanumtrk[particle]), track.eta()); + histos.fill(HIST(hphinumtrk[particle]), track.phi()); + if (!track.hasTOF()) { + return; + } + histos.fill(HIST(hpnumtof[particle]), mcParticle.p()); + histos.fill(HIST(hptnumtof[particle]), mcParticle.pt()); + histos.fill(HIST(hetanumtof[particle]), mcParticle.eta()); + histos.fill(HIST(hynumtof[particle]), mcParticle.y()); + histos.fill(HIST(hphinumtof[particle]), mcParticle.phi()); + } + + template + void fillParticleHistograms(const particleType& mcParticle) + { + if (!isPdgSelected(mcParticle)) { // Selecting PDG code + return; + } + + histos.fill(HIST(hpden[particle]), mcParticle.p()); + histos.fill(HIST(hptden[particle]), mcParticle.pt()); + histos.fill(HIST(hetaden[particle]), mcParticle.eta()); + histos.fill(HIST(hyden[particle]), mcParticle.y()); + histos.fill(HIST(hphiden[particle]), mcParticle.phi()); + histos.fill(HIST(hptetaden[particle]), mcParticle.pt(), mcParticle.eta()); + } + + template + void fillEfficiency() + { + + TList* subList = static_cast(listEfficiency->FindObject(o2::track::PID::getName(particle))); + if (!subList) { + return; + } + + auto fillEfficiency = [&](int index, auto num, auto den) { + static_cast(subList->At(index))->SetTotalHistogram(*histos.get(den).get(), "f"); + static_cast(subList->At(index))->SetPassedHistogram(*histos.get(num).get(), "f"); + }; + fillEfficiency(0, HIST(hptnum[particle]), HIST(hptden[particle])); + fillEfficiency(1, HIST(hpnum[particle]), HIST(hpden[particle])); + fillEfficiency(2, HIST(hetanum[particle]), HIST(hetaden[particle])); + fillEfficiency(3, HIST(hphinum[particle]), HIST(hphiden[particle])); + + auto fillEfficiency2D = [&](int index, auto num, auto den) { + static_cast(subList->At(index))->SetTotalHistogram(*histos.get(den).get(), "f"); + static_cast(subList->At(index))->SetPassedHistogram(*histos.get(num).get(), "f"); + }; + fillEfficiency2D(4, HIST(hptetanum[particle]), HIST(hptetaden[particle])); + } + void process(const o2::aod::McParticles& mcParticles, const o2::soa::Join& collisions, const o2::soa::Join& tracks, @@ -258,57 +448,35 @@ struct QaTrackingEfficiency { } recoEvt.resize(nevts); - auto rejectParticle = [&](const auto& p, auto h) { - histos.fill(h, 1); + 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; } - histos.fill(h, 2); + histos.fill(h, 2 + offset); if ((p.pt() < ptMin || p.pt() > ptMax)) { // Check pt return true; } - histos.fill(h, 3); + histos.fill(h, 3 + offset); if ((p.eta() < etaMin || p.eta() > etaMax)) { // Check eta return true; } - histos.fill(h, 4); + histos.fill(h, 4 + offset); if ((p.phi() < phiMin || p.phi() > phiMax)) { // Check phi return true; } - histos.fill(h, 5); + histos.fill(h, 5 + offset); if ((p.y() < yMin || p.y() > yMax)) { // Check rapidity return true; } - histos.fill(h, 6); + histos.fill(h, 6 + offset); if ((selPrim == 1) && !p.isPhysicalPrimary()) { // Requiring is physical primary return true; } - histos.fill(h, 7); + histos.fill(h, 7 + offset); - // Selecting PDG code - switch (pdgSign) { - case 0: - if (abs(p.pdgCode()) != pdg) { - return true; - } - break; - case 1: - if (p.pdgCode() != pdg) { - return true; - } - break; - case -1: - if (p.pdgCode() != -pdg) { - return true; - } - break; - default: - LOG(fatal) << "Provide pdgSign as 0, 1, -1. Provided: " << pdgSign; - break; - } - histos.fill(h, 8); // Select primaries based on position const float dx = p.vx() - p.mcCollision().posX(); const float dy = p.vy() - p.mcCollision().posY(); @@ -316,18 +484,20 @@ struct QaTrackingEfficiency { if (sqrt(dx * dx + dy * dy + dz * dz) > 0.0001) { return true; } - histos.fill(h, 9); + histos.fill(h, 8 + offset); return false; }; + // Track loop for (const auto& track : tracks) { + histos.fill(HIST("trackSelection"), 1); if (!track.has_mcParticle()) { histos.fill(HIST("fakeTrackNoiseHits"), 0.5); continue; } const auto mcParticle = track.mcParticle(); - if (rejectParticle(mcParticle, HIST("trackSelection"))) { + if (rejectParticle(mcParticle, HIST("trackSelection"), 1)) { continue; } @@ -353,22 +523,35 @@ struct QaTrackingEfficiency { continue; } histos.fill(HIST("trackSelection"), 12); + // Filling variable histograms histos.fill(HIST("trackLength"), track.length()); - histos.fill(HIST("p/num"), mcParticle.p()); - histos.fill(HIST("pt/num"), mcParticle.pt()); - histos.fill(HIST("eta/num"), mcParticle.eta()); - histos.fill(HIST("y/num"), mcParticle.y()); - histos.fill(HIST("phi/num"), mcParticle.phi()); - histos.fill(HIST("pteta/num"), mcParticle.pt(), mcParticle.eta()); - if (!track.hasTOF()) { - continue; + if (doEl) { + fillTrackHistograms(track); + } + if (doMu) { + fillTrackHistograms(track); + } + if (doPi) { + fillTrackHistograms(track); + } + if (doKa) { + fillTrackHistograms(track); + } + if (doPr) { + fillTrackHistograms(track); + } + if (doDe) { + fillTrackHistograms(track); + } + if (doTr) { + fillTrackHistograms(track); + } + if (doHe) { + fillTrackHistograms(track); + } + if (doAl) { + fillTrackHistograms(track); } - histos.fill(HIST("trackSelection"), 13); - histos.fill(HIST("p/numtof"), mcParticle.p()); - histos.fill(HIST("pt/numtof"), mcParticle.pt()); - histos.fill(HIST("eta/numtof"), mcParticle.eta()); - histos.fill(HIST("y/numtof"), mcParticle.y()); - histos.fill(HIST("phi/numtof"), mcParticle.phi()); } float dNdEta = 0; @@ -380,36 +563,70 @@ struct QaTrackingEfficiency { continue; } - histos.fill(HIST("p/den"), mcParticle.p()); - histos.fill(HIST("pt/den"), mcParticle.pt()); - histos.fill(HIST("eta/den"), mcParticle.eta()); - histos.fill(HIST("y/den"), mcParticle.y()); - histos.fill(HIST("phi/den"), mcParticle.phi()); - histos.fill(HIST("pteta/den"), mcParticle.pt(), mcParticle.eta()); + if (doEl) { + fillParticleHistograms(mcParticle); + } + if (doMu) { + fillParticleHistograms(mcParticle); + } + if (doPi) { + fillParticleHistograms(mcParticle); + } + if (doKa) { + fillParticleHistograms(mcParticle); + } + if (doPr) { + fillParticleHistograms(mcParticle); + } + if (doDe) { + fillParticleHistograms(mcParticle); + } + if (doTr) { + fillParticleHistograms(mcParticle); + } + if (doHe) { + fillParticleHistograms(mcParticle); + } + if (doAl) { + fillParticleHistograms(mcParticle); + } } histos.fill(HIST("eventMultiplicity"), dNdEta * 0.5f / 2.f); if (makeEff) { - auto fillEfficiency = [&](int index, auto num, auto den) { - static_cast(list->At(index))->SetTotalHistogram(*histos.get(den).get(), "f"); - static_cast(list->At(index))->SetPassedHistogram(*histos.get(num).get(), "f"); - }; - fillEfficiency(0, HIST("pt/num"), HIST("pt/den")); - fillEfficiency(1, HIST("p/num"), HIST("p/den")); - fillEfficiency(2, HIST("eta/num"), HIST("eta/den")); - fillEfficiency(3, HIST("phi/num"), HIST("phi/den")); - - auto fillEfficiency2D = [&](int index, auto num, auto den) { - static_cast(list->At(index))->SetTotalHistogram(*histos.get(den).get(), "f"); - static_cast(list->At(index))->SetPassedHistogram(*histos.get(num).get(), "f"); - }; - fillEfficiency2D(4, HIST("pteta/num"), HIST("pteta/den")); + if (doEl) { + fillEfficiency(); + } + if (doMu) { + fillEfficiency(); + } + if (doPi) { + fillEfficiency(); + } + if (doKa) { + fillEfficiency(); + } + if (doPr) { + fillEfficiency(); + } + if (doDe) { + fillEfficiency(); + } + if (doTr) { + fillEfficiency(); + } + if (doHe) { + fillEfficiency(); + } + if (doAl) { + fillEfficiency(); + } } } }; /// Task to QA the efficiency of a particular particle defined by its pdg code -struct QaTrackingEfficiencyData { +struct QaEfficiencyData { // Track selection Configurable etaMin{"eta-min", -3.f, "Lower limit in eta"}; Configurable etaMax{"eta-max", 3.f, "Upper limit in eta"}; @@ -430,7 +647,7 @@ struct QaTrackingEfficiencyData { // Task configuration Configurable makeEff{"make-eff", false, "Flag to produce the efficiency with TEfficiency"}; - OutputObj list{"Efficiency"}; + OutputObj listEfficiency{"Efficiency"}; HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; void init(InitContext&) @@ -453,6 +670,9 @@ struct QaTrackingEfficiencyData { ptMin.value, ptMax.value); const AxisSpec axisPhi{phiBins, phiMin, phiMax, "#it{#varphi} (rad)"}; + const TString tagEtaPhi = Form("#it{p}_{T} [%.2f,%.2f]", + ptMin.value, ptMax.value); + const AxisSpec axisSel{9, 0.5, 9.5, "Selection"}; histos.add("eventSelection", "Event Selection", kTH1D, {axisSel}); histos.get(HIST("eventSelection"))->GetXaxis()->SetBinLabel(1, "Events read"); @@ -468,65 +688,75 @@ struct QaTrackingEfficiencyData { histos.add("trackLength", "Track length;Track length (cm)", kTH1D, {{2000, -1000, 1000}}); - histos.add("pt/num", "Numerator " + tagPt, kTH1D, {axisPt}); - histos.add("pt/den", "Denominator " + tagPt, kTH1D, {axisPt}); + // Sum + histos.add("sum/pt/num", "Numerator " + tagPt, kTH1D, {axisPt}); + histos.add("sum/pt/den", "Denominator " + tagPt, kTH1D, {axisPt}); - histos.add("eta/num", "Numerator " + tagEta, kTH1D, {axisEta}); - histos.add("eta/den", "Denominator " + tagEta, kTH1D, {axisEta}); + histos.add("sum/eta/num", "Numerator " + tagEta, kTH1D, {axisEta}); + histos.add("sum/eta/den", "Denominator " + tagEta, kTH1D, {axisEta}); - histos.add("phi/num", "Numerator " + tagPhi, kTH1D, {axisPhi}); - histos.add("phi/den", "Denominator " + tagPhi, kTH1D, {axisPhi}); + histos.add("sum/phi/num", "Numerator " + tagPhi, kTH1D, {axisPhi}); + histos.add("sum/phi/den", "Denominator " + tagPhi, kTH1D, {axisPhi}); + + histos.add("sum/etaphi/num", "Numerator " + tagPhi, kTH2D, {axisEta, axisPhi}); + histos.add("sum/etaphi/den", "Denominator " + tagPhi, kTH2D, {axisEta, axisPhi}); // Pos - histos.add("ptpos/num", "Numerator Positve " + tagPt, kTH1D, {axisPt}); - histos.add("ptpos/den", "Denominator Positve " + tagPt, kTH1D, {axisPt}); + histos.add("pos/pt/num", "Numerator Positve " + tagPt, kTH1D, {axisPt}); + histos.add("pos/pt/den", "Denominator Positve " + tagPt, kTH1D, {axisPt}); + + histos.add("pos/eta/num", "Numerator Positve " + tagEta, kTH1D, {axisEta}); + histos.add("pos/eta/den", "Denominator Positve " + tagEta, kTH1D, {axisEta}); - histos.add("etapos/num", "Numerator Positve " + tagEta, kTH1D, {axisEta}); - histos.add("etapos/den", "Denominator Positve " + tagEta, kTH1D, {axisEta}); + histos.add("pos/phi/num", "Numerator Positve " + tagPhi, kTH1D, {axisPhi}); + histos.add("pos/phi/den", "Denominator Positve " + tagPhi, kTH1D, {axisPhi}); - histos.add("phipos/num", "Numerator Positve " + tagPhi, kTH1D, {axisPhi}); - histos.add("phipos/den", "Denominator Positve " + tagPhi, kTH1D, {axisPhi}); + histos.add("pos/etaphi/num", "Numerator Positive " + tagEtaPhi, kTH2D, {axisEta, axisPhi}); + histos.add("pos/etaphi/den", "Denominator Positive " + tagEtaPhi, kTH2D, {axisEta, axisPhi}); // Neg - histos.add("ptneg/num", "Numerator Negative " + tagPt, kTH1D, {axisPt}); - histos.add("ptneg/den", "Denominator Negative " + tagPt, kTH1D, {axisPt}); + histos.add("neg/pt/num", "Numerator Negative " + tagPt, kTH1D, {axisPt}); + histos.add("neg/pt/den", "Denominator Negative " + tagPt, kTH1D, {axisPt}); + + histos.add("neg/eta/num", "Numerator Negative " + tagEta, kTH1D, {axisEta}); + histos.add("neg/eta/den", "Denominator Negative " + tagEta, kTH1D, {axisEta}); - histos.add("etaneg/num", "Numerator Negative " + tagEta, kTH1D, {axisEta}); - histos.add("etaneg/den", "Denominator Negative " + tagEta, kTH1D, {axisEta}); + histos.add("neg/phi/num", "Numerator Negative " + tagPhi, kTH1D, {axisPhi}); + histos.add("neg/phi/den", "Denominator Negative " + tagPhi, kTH1D, {axisPhi}); - histos.add("phineg/num", "Numerator Negative " + tagPhi, kTH1D, {axisPhi}); - histos.add("phineg/den", "Denominator Negative " + tagPhi, kTH1D, {axisPhi}); + histos.add("neg/etaphi/num", "Numerator Negative " + tagEtaPhi, kTH2D, {axisEta, axisPhi}); + histos.add("neg/etaphi/den", "Denominator Negative " + tagEtaPhi, kTH2D, {axisEta, axisPhi}); - list.setObject(new TList); + listEfficiency.setObject(new TList); if (makeEff) { auto makeEfficiency = [&](TString effname, TString efftitle, auto templateHisto) { TAxis* axis = histos.get(templateHisto)->GetXaxis(); if (axis->IsVariableBinSize()) { - list->Add(new TEfficiency(effname, efftitle, axis->GetNbins(), axis->GetXbins()->GetArray())); + listEfficiency->Add(new TEfficiency(effname, efftitle, axis->GetNbins(), axis->GetXbins()->GetArray())); } else { - list->Add(new TEfficiency(effname, efftitle, axis->GetNbins(), axis->GetXmin(), axis->GetXmax())); + listEfficiency->Add(new TEfficiency(effname, efftitle, axis->GetNbins(), axis->GetXmin(), axis->GetXmax())); } }; auto makeEfficiency2D = [&](TString effname, TString efftitle, auto templateHistoX, auto templateHistoY) { TAxis* axisX = histos.get(templateHistoX)->GetXaxis(); - TAxis* axisY = histos.get(templateHistoY)->GetXaxis(); + TAxis* axisY = histos.get(templateHistoY)->GetYaxis(); if (axisX->IsVariableBinSize() || axisY->IsVariableBinSize()) { - list->Add(new TEfficiency(effname, efftitle, axisX->GetNbins(), axisX->GetXbins()->GetArray(), axisY->GetNbins(), axisY->GetXbins()->GetArray())); + listEfficiency->Add(new TEfficiency(effname, efftitle, axisX->GetNbins(), axisX->GetXbins()->GetArray(), axisY->GetNbins(), axisY->GetXbins()->GetArray())); } else { - list->Add(new TEfficiency(effname, efftitle, axisX->GetNbins(), axisX->GetXmin(), axisX->GetXmax(), axisY->GetNbins(), axisY->GetXmin(), axisY->GetXmax())); + listEfficiency->Add(new TEfficiency(effname, efftitle, axisX->GetNbins(), axisX->GetXmin(), axisX->GetXmax(), axisY->GetNbins(), axisY->GetXmin(), axisY->GetXmax())); } }; - makeEfficiency("efficiencyVsPt", "Efficiency in data " + tagPt + ";#it{p}_{T} (GeV/#it{c});Efficiency", HIST("pt/num")); - makeEfficiency("efficiencyVsP", "Efficiency in data " + tagPt + ";#it{p} (GeV/#it{c});Efficiency", HIST("pt/num")); - makeEfficiency("efficiencyVsEta", "Efficiency in data " + tagEta + ";#it{#eta};Efficiency", HIST("eta/num")); - makeEfficiency("efficiencyVsPhi", "Efficiency in data " + tagPhi + ";#it{#varphi} (rad);Efficiency", HIST("phi/num")); + makeEfficiency("efficiencyVsPt", "Efficiency in data " + tagPt + ";#it{p}_{T} (GeV/#it{c});Efficiency", HIST("sum/pt/num")); + makeEfficiency("efficiencyVsP", "Efficiency in data " + tagPt + ";#it{p} (GeV/#it{c});Efficiency", HIST("sum/pt/num")); + makeEfficiency("efficiencyVsEta", "Efficiency in data " + tagEta + ";#it{#eta};Efficiency", HIST("sum/eta/num")); + makeEfficiency("efficiencyVsPhi", "Efficiency in data " + tagPhi + ";#it{#varphi} (rad);Efficiency", HIST("sum/phi/num")); - makeEfficiency2D("efficiencyVsPtVsEta", Form("Efficiency in data #it{#varphi} [%.2f,%.2f];%s;%s;Efficiency", phiMin.value, phiMax.value, "#it{p}_{T} (GeV/#it{c})", "#it{#eta}"), HIST("pt/num"), HIST("eta/num")); - makeEfficiency2D("efficiencyVsPtVsPhi", Form("Efficiency in data #it{#eta} [%.2f,%.2f];%s;%s;Efficiency", etaMin.value, etaMax.value, "#it{p}_{T} (GeV/#it{c})", "#it{#varphi} (rad)"), HIST("pt/num"), HIST("phi/num")); + makeEfficiency2D("efficiencyVsPtVsEta", Form("Efficiency in data #it{#varphi} [%.2f,%.2f];%s;%s;Efficiency", phiMin.value, phiMax.value, "#it{p}_{T} (GeV/#it{c})", "#it{#eta}"), HIST("sum/pt/num"), HIST("sum/eta/num")); + makeEfficiency2D("efficiencyVsPtVsPhi", Form("Efficiency in data #it{#eta} [%.2f,%.2f];%s;%s;Efficiency", etaMin.value, etaMax.value, "#it{p}_{T} (GeV/#it{c})", "#it{#varphi} (rad)"), HIST("sum/pt/num"), HIST("sum/phi/num")); } } - void process(const o2::aod::Collision& collision, + void process(o2::soa::Join::iterator const& collision, const o2::soa::Join& tracks) { @@ -560,31 +790,46 @@ struct QaTrackingEfficiencyData { histos.fill(HIST("trackSelection"), 5); histos.fill(HIST("trackLength"), track.length()); - histos.fill(HIST("pt/den"), track.pt()); - histos.fill(HIST("eta/den"), track.eta()); - histos.fill(HIST("phi/den"), track.phi()); + histos.fill(HIST("sum/pt/den"), track.pt()); + histos.fill(HIST("sum/eta/den"), track.eta()); + histos.fill(HIST("sum/phi/den"), track.phi()); + histos.fill(HIST("sum/etaphi/den"), track.eta(), track.phi()); + if (track.sign() > 0) { + histos.fill(HIST("pos/pt/den"), track.pt()); + histos.fill(HIST("pos/eta/den"), track.eta()); + histos.fill(HIST("pos/phi/den"), track.phi()); + histos.fill(HIST("pos/etaphi/den"), track.eta(), track.phi()); + } else { + histos.fill(HIST("neg/pt/den"), track.pt()); + histos.fill(HIST("neg/eta/den"), track.eta()); + histos.fill(HIST("neg/phi/den"), track.phi()); + histos.fill(HIST("neg/etaphi/den"), track.eta(), track.phi()); + } if (track.hasTOF()) { - histos.fill(HIST("pt/num"), track.pt()); - histos.fill(HIST("eta/num"), track.eta()); - histos.fill(HIST("phi/num"), track.phi()); + histos.fill(HIST("sum/pt/num"), track.pt()); + histos.fill(HIST("sum/eta/num"), track.eta()); + histos.fill(HIST("sum/phi/num"), track.phi()); + histos.fill(HIST("sum/etaphi/num"), track.eta(), track.phi()); if (track.sign() > 0) { - histos.fill(HIST("ptpos/num"), track.pt()); - histos.fill(HIST("etapos/num"), track.eta()); - histos.fill(HIST("phipos/num"), track.phi()); + histos.fill(HIST("pos/pt/num"), track.pt()); + histos.fill(HIST("pos/eta/num"), track.eta()); + histos.fill(HIST("pos/phi/num"), track.phi()); + histos.fill(HIST("pos/etaphi/num"), track.eta(), track.phi()); } else { - histos.fill(HIST("ptneg/num"), track.pt()); - histos.fill(HIST("etaneg/num"), track.eta()); - histos.fill(HIST("phineg/num"), track.phi()); + histos.fill(HIST("neg/pt/num"), track.pt()); + histos.fill(HIST("neg/eta/num"), track.eta()); + histos.fill(HIST("neg/phi/num"), track.phi()); + histos.fill(HIST("neg/etaphi/num"), track.eta(), track.phi()); } } if (makeEff) { - static_cast(list->At(0))->Fill(track.hasTOF(), track.pt()); - static_cast(list->At(1))->Fill(track.hasTOF(), track.p()); - static_cast(list->At(2))->Fill(track.hasTOF(), track.eta()); - static_cast(list->At(3))->Fill(track.hasTOF(), track.phi()); - static_cast(list->At(4))->Fill(track.hasTOF(), track.pt(), track.eta()); - static_cast(list->At(5))->Fill(track.hasTOF(), track.pt(), track.phi()); + static_cast(listEfficiency->At(0))->Fill(track.hasTOF(), track.pt()); + static_cast(listEfficiency->At(1))->Fill(track.hasTOF(), track.p()); + static_cast(listEfficiency->At(2))->Fill(track.hasTOF(), track.eta()); + static_cast(listEfficiency->At(3))->Fill(track.hasTOF(), track.phi()); + static_cast(listEfficiency->At(4))->Fill(track.hasTOF(), track.pt(), track.eta()); + static_cast(listEfficiency->At(5))->Fill(track.hasTOF(), track.pt(), track.phi()); } } } @@ -595,82 +840,16 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) WorkflowSpec w; // Data if (cfgc.options().get("eff-data")) { - w.push_back(adaptAnalysisTask(cfgc)); - } - // Sign blind - if (cfgc.options().get("eff-el")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-electron"})); - } - if (cfgc.options().get("eff-mu")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-muon"})); - } - if (cfgc.options().get("eff-pi")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-pion"})); - } - if (cfgc.options().get("eff-ka")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-kaon"})); - } - if (cfgc.options().get("eff-pr")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-proton"})); - } - if (cfgc.options().get("eff-de")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-deuteron"})); - } - if (cfgc.options().get("eff-tr")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-triton"})); - } - if (cfgc.options().get("eff-he")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-helium3"})); - } - // Pos - if (cfgc.options().get("eff-el-pos")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-electron-pos"})); - } - if (cfgc.options().get("eff-mu-pos")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-muon-pos"})); - } - if (cfgc.options().get("eff-pi-pos")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-pion-pos"})); - } - if (cfgc.options().get("eff-ka-pos")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-kaon-pos"})); - } - if (cfgc.options().get("eff-pr-pos")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-proton-pos"})); - } - if (cfgc.options().get("eff-de-pos")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-deuteron-pos"})); - } - if (cfgc.options().get("eff-tr-pos")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-triton-pos"})); - } - if (cfgc.options().get("eff-he-pos")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-helium3-pos"})); - } - // Neg - if (cfgc.options().get("eff-el-neg")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-electron-neg"})); - } - if (cfgc.options().get("eff-mu-neg")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-muon-neg"})); - } - if (cfgc.options().get("eff-pi-neg")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-pion-neg"})); - } - if (cfgc.options().get("eff-ka-neg")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-kaon-neg"})); - } - if (cfgc.options().get("eff-pr-neg")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-proton-neg"})); + w.push_back(adaptAnalysisTask(cfgc)); } - if (cfgc.options().get("eff-de-neg")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-deuteron-neg"})); + if (cfgc.options().get("eff-mc")) { // Sign blind + w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-efficiency"})); } - if (cfgc.options().get("eff-tr-neg")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-triton-neg"})); + if (cfgc.options().get("eff-mc-pos")) { // Pos + w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-efficiency-pos"})); } - if (cfgc.options().get("eff-he-neg")) { - w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-tracking-efficiency-helium3-neg"})); + if (cfgc.options().get("eff-mc-neg")) { // Neg + w.push_back(adaptAnalysisTask>(cfgc, TaskName{"qa-efficiency-neg"})); } return w; }